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

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

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

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

答え2

余分な空行は重要ではないので

gawk 'BEGIN {RS=""} !/^[$(]/ {gsub("\n"," ")} {print;print "\n"}' 

説明する。RS=""gawkを短絡モードに設定します。またはで始まらない段落!/^[$(]/と一致します。改行を空白に変更します。出力データと改行。($gsub("\n"," ")print;print "\n"

答え3

GNU sed

段落を予約済みスペースに保存します。この方法は複数の空行を保持します。

sed -e '
  /./,/^$/!b
  H;/./{$!d;}
  z;x;s/.//;$!s/.$//
  /^[$(]/!y/\n/ /
  $!G
' file

perl -pl -00e '
  y/\n/ / unless /^[$(]/;
  s/$/\n/ unless eof;
' file

Perlの短絡モード-00。連続した空白行は1行に縮小されます。

関連情報