複数行の文を介したSed代替


11

私はsedを使用するのは初めてですが、sed s/..../..../(代替)を試して、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リファレンスブック:sedチュートリアルおよびリファレンスの決定版ガイドby Daniel A. Goldman ISBN:978-1-939824-01-1(EPUBバージョン)08148804441822
Joe

回答:


16

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

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

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


3
@Gilles私はあなたの善意を理解していますが、私の答えを台無しにする前にテストしてみてください。別の意見がある場合は、別の回答を追加するかコメントを残すことをお勧めします。
ラドゥラデアヌ

Stack Exchangeへようこそ。このサイトは共同編集されています。投稿が他の信頼できるユーザーによって共同編集されるというアイデアに不安がある場合、これはあなたのためのサイトではないかもしれません。私はフレーズを編集したので、私は、あなたのコードがより意図された特定のフレーズよりも置き換えることに気づいた。
ジル「SO-停止されて悪」

@Gillesいたずらをする必要はありません。また、「コード」がまったく何も置き換えないことにも注意してください。私が言ったように、私はあなたの善意を理解しています。私の例から、OPは複数行の文をで置換する方法を理解するためにsed、それ以上何もしないと思います。これがタイトルの質問です。タイトルは約ではありませんperl
ラドゥラデアヌ

いいえ、投稿したコードは機能します。(場合を除きLorem、最後の行にある、欠陥それはあなたのバージョンで共有しています。)
ジル「SO-停止されて悪」

3行以上のテキストがある場合、この例は機能しません。(
artnikpro

12

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

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'

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


@terdonああ、複数の空白を許可するつもりでしたが、忘れていました。修正済み。
ジル 'SO-悪であるのをやめる'

問題はについてsedです。またsed、ではなくでタグ付けされperlます。
ラドゥラデアヌ

0

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


7
sed 複数行にわたって読み取ることができます!
ラドゥラデアヌ

3
@RaduRădeanu技術的には、はい。しかし、それはめったに面倒の価値はありません。
ジル 'SO-悪

3
@Gilles使用perlがより簡単な場合、これはsedめったにトラブルの価値がないということではありません。
ラドゥラデアヌ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.