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行に縮小されます。