Regular-Expression
如何在 Ed 中用一個空行替換兩個或多個空行?
在 Ed 中,我可以進行搜尋以替換所有空行,如下所示:
g/^$/d
這將刪除所有空行。但是如果我想刪除兩個或多個空行並保留 1 怎麼辦?例如:
Line 1 Line 2 Line 3
變成:
Line 1 Line 2 Line 3
改編自Vim Wiki:
ed -s file <<EOF v/./.,/./-1j w q EOF
v/./
:選擇所有與正則表達式不匹配的行.
(即,選擇所有空行)。對它們執行以下操作:
.,/./-1j
:j
oin 命令從選定的行 (.
) 應用到下一個非空行 (/./-1
) 上方的行。
w q
: 保存並退出。您可以%p Q
改為只顯示輸出而不修改文件。雖然同樣有效,但我最初的建議更複雜:
printf '%s\n' 'g/^$/.,/./-1d\' 'i\' '' w q | ed -s file
這個對單個
g
lobal 命令使用兩個命令(通常命令列表由單個命令組成),這需要為其命令列表添加帶有反斜杠的換行符前綴。
g/^$/
:選擇所有空行。
.,/./-1d\
:d
從選定的行 (.
) 直到下一個非空行 (/./-1
) 上方的行。這將刪除所有空行,所以'i\' ''
:i
在上面插入一個新的空行。相當於使用here-docs或 Printf 來餵 Ed。只需選擇您最喜歡的一個。
參考:POSIX Ed。