Considerar:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Isso corresponderá às linhas 3, 4 e 5.
Mas estou tentando corresponder apenas às linhas 3 e 5 (não 4). E acrescente 'teste' depois deles.
echo ... | sed -e '3a test' -e '5a test'
Se a operação for mais complexa do que neste caso, você poderá usar uma estrutura como esta:
sed 'b pattern; : action; a \
lalala
b end; : pattern; 3b action; 5b action; : end'
Ou seja, você coloca todos os comandos necessários entre b pattern;
e b end;
.
E você adiciona todos os seus padrões (números de linha ou o que for) depois : pattern;
.
O que acontece é o seguinte:
O primeiro comando salta sobre a parte da ação (talvez seja mais fácil ler se os padrões estão no início e b end;
diretamente antes da parte da ação).
Se um padrão corresponder, a execução pulará para a parte da ação. Após a execução da parte da ação, salta para o final.
Eu tento arrumar isso:
sed '3b action; 5b action; b end; : action; a \
lalala
: end'
Em uma única linha seria como:
sed "3b idAction; 5b idAction; b; : idAction; a test"
Portably, você precisa escrevê-lo:
sed '
3b action
5b action
b
: action
a\
lalala'
( b
sem ramificações de rótulo até o final, para que você não precise de um end
rótulo explícito , ;
é válido um caractere em um rótulo nas sed
implementações padrão ).
Com
sed
(consulte a resposta de @ HaukeLaging )Com
awk
:Com
perl
:fonte
perl -lnE 'say if $. ~~ @{[3,5]}'
~~
, não entendo tão bem quanto deveria. Além disso, ambossay
e~~
precisam de perl v> = 5.10, certo?perl -pE 'say "test" if $. ~~ @{[4,6]}'
- este prepends a linha: perl do-p
faz uma impressão implícita no final do programa dado.Como o @HaukeLaging já disse, este comando faz o que você deseja:
Agora, isso pode se tornar bastante complicado de digitar, se você quiser combinar, por exemplo, 20 linhas.
Nesses casos, supondo que seu shell suporte a expansão entre chaves , você pode usar este comando:
(Observe que os colchetes e a vírgula devem permanecer sem aspas.)
Como resultado, o shell transmitirá os argumentos para
-e3a test
e-e5a test
para sed, que é exatamente o que o primeiro comando faz.fonte