![ファイル内の単語を検索し、その 2 行下にテキストを挿入するにはどうすればよいでしょうか?](https://rvso.com/image/97225/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%81%AE%E5%8D%98%E8%AA%9E%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%80%81%E3%81%9D%E3%81%AE%202%20%E8%A1%8C%E4%B8%8B%E3%81%AB%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E6%8C%BF%E5%85%A5%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
キーワードを検索し、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
変更内容をそのまま書き込みます。