Regular-Expression

如何在 Ed 中用一個空行替換兩個或多個空行?

  • July 8, 2021

在 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: join 命令從選定的行 ( .) 應用到下一個非空行 ( /./-1) 上方的行。
  • w q: 保存並退出。您可以%p Q改為只顯示輸出而不修改文件。


雖然同樣有效,但我最初的建議更複雜:

printf '%s\n' 'g/^$/.,/./-1d\' 'i\' '' w q | ed -s file

這個對單個global 命令使用兩個命令(通常命令列表由單個命令組成),這需要為其命令列表添加帶有反斜杠的換行符前綴。

  • g/^$/:選擇所有空行。

    • .,/./-1d\d從選定的行 ( .) 直到下一個非空行 ( /./-1) 上方的行。這將刪除所有空行,所以
    • 'i\' '':i在上面插入一個新的空行。

相當於使用here-docs或 Printf 來餵 Ed。只需選擇您最喜歡的一個。

參考:POSIX Ed

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