テキストファイルの1行を置き換えますが、その行の前に特定の複数行パターンがある場合にのみ適用されます。

テキストファイルの1行を置き換えますが、その行の前に特定の複数行パターンがある場合にのみ適用されます。

私のファイルには以下が含まれます。

パイナップル
りんご
バナナ
ブドウ
スイカ
オレンジ
りんご
バナナ
マンゴー
プラム
バナナ

私はこれを次のようにしたいと思います:

パイナップル
りんご
バナナ
ブドウ
スイカ
オレンジ
りんご
バナナ
オリーブ
マンゴー
プラム
バナナ

ここでは「Rice」を「Olive」に変更します。ただし、「Rice」が複数行パターンに従う場合にのみ、特に「Rice」が複数行パターンの後に表示される場合にのみ該当します。

オレンジ
りんご
バナナ

awk、、、またはその他perlsedツールを使用する意思があります。

答え1

Perlはこれをとてもよく行います。

perl -0pe 's/Orange\nApple\nBanana\n\KRice/Olive/' input.txt

正規表現を練習してテストできます。正規表現 101

答え2

考えられる解決策の1つ:

paste -d' ' -s myfile \
 | sed 's/\(Orange Apple Banana\) Rice/\1 Olive/g' \
 | tr ' ' '\n'

説明する:

paste -d' ' -s myfile各行を取る。私のファイル区切り文字(スペース)で区切って連続して(つまり、1行に)貼り付けます。 1行に1単語を入力する代わりに、1行にすべての単語を入力できます。

sed 's/\(Orange Apple Banana\) Rice/\1 Olive/g'入力を検索し、「オレンジりんごバナナライス」が出るたびに、「オレンジリンゴバナナオリーブ」に置き換えます。

tr ' ' '\n'入力のすべての空白文字を改行に変換して、1行の入力を1行に1語ずつ元の形式に変換します。

関連情報