ファイル内の単語を見つけ、その下に2行のテキストを挿入する方法は?

ファイル内の単語を見つけ、その下に2行のテキストを挿入する方法は?

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

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

the
cow
goes
moo

私は「cow」という単語を探して、「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 '{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

変更を所定の位置に記録します。

関連情報