web-dev-qa-db-ja.com

Sed複数行の文で置換

私はsedを使用するのは初めてですが、sedのs/..../..../(substitute)を試して、1行にある場合は完全な文を変更しますが、2つに分かれている可能性のある文を変更する方法に関する代替解決策を知りません次のような行:

この:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

実際には次のように書かれています:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

これをどのように検出するか、1行ではなく2行であっても文全体を置き換えるようにコーディングできますか?

次のコマンドは、両方の状況で機能します。

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

詳細な説明: sedを使用して複数行の文字列を置き換えるにはどうすればよいですか?

16
Radu Rădeanu

Sedは複数行のパターンに一致できますが(コマンドNまたはHを使用して、一致する前に連続する行を追加します)、これは快適ゾーンの外にあります。痛みが好きな場合にのみ試してください。

Perlはこの種のことをうまく行うことができます。 -pスイッチ を使用して、標準入力を一度に1レコードずつ処理し、変更されたレコードを出力(アラード)し、 -000 を使用して段落モードをオンにします(レコード空白行で区切られています)。正規表現では、 \s は、改行を含む任意の空白文字に一致します。

Perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

元のテキストに改行が含まれているときに、置換テキストに改行を入れたい場合、それはより複雑です。その方法は、改行を配置する場所に関する要件によって異なります。

12
Gilles

sedは複数行にわたって簡単に読み取ることができません。代わりにPerl -i -0pe 's/.../.../...'を使用してください。

0
To Do