Como encontro uma palavra em um arquivo e insiro texto duas linhas abaixo dela?

Como encontro uma palavra em um arquivo e insiro texto duas linhas abaixo dela?

Eu tenho um arquivo no qual desejo encontrar uma palavra-chave e inserir o texto 2 linhas abaixo.

Por exemplo, digamos que o arquivo que possuo contém as seguintes palavras

the
cow
goes
moo

Quero encontrar a palavra "vaca" e inserir o texto "yay" no arquivo 2 linhas abaixo da palavra vaca.

the
cow
goes
moo
yay

Acredito que isso seria feito, sedmas não consigo fazê-lo funcionar.

Qualquer ajuda é muito apreciada.

Responder1

$ cat ip.txt 
the
cow
goes
moo

$ sed '/cow/{N;N; s/$/\nyay/}' ip.txt 
the
cow
goes
moo
yay
  • N;N;obter as próximas duas linhas
  • s/$/\nyay/adicione outra linha

Responder2

Com awk:

awk '/cow/ {print; getline; print; getline; print; print "yay"; next}; 1'
  • /cow/corresponde cowno registro, e depois {print; getline; print; getline; print; print "yay"; next}imprime a linha, getlinenos dá a próxima linha, que é impressa também, o mesmo para a próxima, e depois yayé impressa, depois vai para a próxima linha ( next)

  • 1(true) imprimirá o restante das linhas como ação padrão

Embargo:

  • Se houver menos de duas linhas entre o padrão a ser pesquisado e o EOF, então a última linha começando no padrão será repetida para formar duas linhas entre eles.

Exemplo:

% cat file.txt
the
cow
goes
moo

% awk '/cow/ {print; getline; print; getline; print; print "yay"; next}; 1' file.txt
the
cow
goes
moo
yay

Responder3

Outrosed

sed '/cow/! b;n;n;a\yay' file.txt

Outroestranho

awk '{print;this--};/cow/{this=2}! this{print "yay"}' file.txt

Responder4

Comed

ed file << EOF
/cow/+2a
yay
.
,p
q
EOF

para imprimir a saída modificada; ou

ed file << EOF
/cow/+2a
yay
.
wq
EOF

ou (como bashuma linha)

printf '%b\n' '/cow/+2a' 'yay\n.' 'wq' | ed file

para escrever as mudanças no lugar.

informação relacionada