Рассматривать:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Это будет соответствовать линиям 3, 4 и 5.
Но я пытаюсь сопоставить только строки 3 и 5 (не 4). И добавьте «тест» после них.
echo ... | sed -e '3a test' -e '5a test'
Если операция более сложная, чем в этом случае, вы можете использовать такую структуру:
sed 'b pattern; : action; a \
lalala
b end; : pattern; 3b action; 5b action; : end'
Т.е. вы помещаете все необходимые команды между b pattern;
и b end;
.
И вы добавляете все ваши шаблоны (номера строк или что-то еще) после : pattern;
.
Что происходит, это:
Первая команда перепрыгивает через часть действия (возможно, легче прочитать, если шаблоны находятся в начале и b end;
непосредственно перед частью действия).
Если шаблон соответствует, то выполнение переходит к части действия. После выполнения действия часть прыгает до конца.
Я пытаюсь привести в порядок это:
sed '3b action; 5b action; b end; : action; a \
lalala
: end'
В одной строке будет выглядеть так:
sed "3b idAction; 5b idAction; b; : idAction; a test"
Портативно, вам нужно написать это:
sed '
3b action
5b action
b
: action
a\
lalala'
( b
без разветвления метки до конца, поэтому вам не нужна явная end
метка, ;
в стандартных sed
реализациях допустимый символ в метке ).
С
sed
(см. Ответ @ HaukeLaging )С
awk
:С
perl
:источник
perl -lnE 'say if $. ~~ @{[3,5]}'
~~
, не понимаю это так, как следовало бы. Кроме того, обаsay
и~~
нужно Perl V> = 5,10 правильно?perl -pE 'say "test" if $. ~~ @{[4,6]}'
- это добавляет строку: perl's-p
неявно печатает в конце данной программы.Как сказал @HaukeLaging aleady, эта команда делает то, что вы хотите:
Теперь это может быть довольно громоздким, если вы хотите сопоставить, например, 20 строк.
В этих случаях, если ваша оболочка поддерживает расширение скобок , вы можете использовать эту команду вместо:
(Обратите внимание, что фигурные скобки и запятая должны оставаться без кавычек.)
В результате оболочка передаст аргументы
-e3a test
и-e5a test
в sed, что и делает первая команда.источник