シェルスクリプトが正規表現に一致する範囲内でパターンを検索して置き換えることはできますか?

シェルスクリプトが正規表現に一致する範囲内でパターンを検索して置き換えることはできますか?

stdout特定の正規表現に一致するすべての段落のすべての改行を空白に置き換えるシェルコマンドを作成したいと思います。ここでは、2 つ以上の改行で終わるテキストを段落として定義します。

(特に、またはで始まらないテキスト段落をすべて見つけて、$この段落から改行をすべて削除したいと思います。

たとえば、私のスクリプトを実行してみてください。

Aliquam erat volutpat.  Nunc ( eleifend leo vitae magna.  In (i)yd erat non orci
commodo lobortis.  Proin $ neque massa, cursus ut, gravida ut, lobortis eget,
lacus.  Sed diam.

Hello world.

(Nullam tristique diam
non turpis.



Hello
$again!

$foo
bar

結果が出なければならない

Aliquam erat volutpat.  Nunc ( eleifend leo vitae magna.  In (i)yd erat non orci commodo lobortis.  Proin $ neque massa, cursus ut, gravida ut, lobortis eget, lacus.  Sed diam.

Hello world.

(Nullam tristique diam
non turpis.



Hello $again!

$foo
bar

可能ですか?

追加の改行を追加するなど、付随的な損傷があるかどうかは気にしません(しかし、付随的な損傷なしに実行できるかどうか疑問に思います!)。

ベストアンサー1

すべてのUnixシステムのすべてのシェルでawkを使用してください。

$ awk -v RS= -v ORS='\n\n' -F'\n' '!/^[($]/{$1=$1} 1' file
Aliquam erat volutpat.  Nunc ( eleifend leo vitae magna.  In (i)yd erat non orci commodo lobortis.  Proin $ neque massa, cursus ut, gravida ut, lobortis eget, lacus.  Sed diam.

Hello world.

(Nullam tristique diam
non turpis.

Hello $again!

$foo
bar

上記のコードは、最初に空白行がなくても、ファイルの最後の段落を含むすべての段落の後に空白行を印刷します。これが問題の場合はお知らせしないのが簡単ですのでお知らせください。

おすすめ記事