ファイル内の単語を検索し、その 2 行下にテキストを挿入するにはどうすればよいでしょうか?

ファイル内の単語を検索し、その 2 行下にテキストを挿入するにはどうすればよいでしょうか?

キーワードを検索し、2 行下にテキストを入力したいファイルがあります。

例えば、私が持っているファイルに次の単語が含まれているとします

the
cow
goes
moo

「cow」という単語を見つけて、その単語の 2 行下に「yay」というテキストをファイルに入力できるようにしたいと考えています。

the
cow
goes
moo
yay

これで完了すると思いますsedが、動作させることができません。

どのような助けでも大歓迎です。

答え1

$ cat ip.txt 
the
cow
goes
moo

$ sed '/cow/{N;N; s/$/\nyay/}' ip.txt 
the
cow
goes
moo
yay
  • N;N;次の2行を取得
  • s/$/\nyay/別の行を追加する

答え2

awk

awk '/cow/ {print; getline; print; getline; print; print "yay"; next}; 1'
  • /cow/cowレコード内で一致し、{print; getline; print; getline; print; print "yay"; next}その行を出力し、getline次の行を取得し、その行も出力し、次の行も同様にyay出力し、次の行に進みます ( next)

  • 1(true) はデフォルトのアクションとして残りの行を印刷します

警告:

  • 検索するパターンとEOFの間に2行未満の行がある場合、パターンから始まる最後の行が繰り返され、その間に2行が作成されます。

例:

% 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

答え3

他のsed

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

他のawk

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

答え4

ed

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

変更された出力を印刷する。または

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

または(bashワンライナーとして)

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

変更内容をそのまま書き込みます。

関連情報