Awk

shell 腳本可以在匹配正則表達式的區域內查找和替換模式嗎?

  • January 6, 2021

我想編寫一個 shell 命令,stdout用空格替換與特定正則表達式匹配的所有段落中的所有換行符。在這裡,我將段落定義為由兩個或更多新行結尾的任何文本。

具體來說,我想找到所有不以(or開頭的文本段落,$並刪除所有換行符的這些段落。

例如,執行我的腳本

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

這可能嗎?

我不介意是否有附帶損害,例如添加額外的換行符(但我也很好奇它是否可以在沒有附帶損害的情況下完成!)。

因為多餘的空行無關緊要

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

解釋。RS=""將 gawk 設置為段落模式。!/^[$(]/匹配不以(or開頭的段落$gsub("\n"," ")將換行符更改為空格。print;print "\n"輸出數據和換行符。

在所有 Unix 機器上的任何 shell 中使用任何 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

上面將在每個段落之後列印一個空行,包括文件中的最後一個,即使它最初沒有。如果這是一個問題,請告訴我們,因為很容易不這樣做。

引用自:https://unix.stackexchange.com/questions/627709