Awk
shell 腳本可以在匹配正則表達式的區域內查找和替換模式嗎?
我想編寫一個 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
上面將在每個段落之後列印一個空行,包括文件中的最後一個,即使它最初沒有。如果這是一個問題,請告訴我們,因為很容易不這樣做。