我如何在 Ed 中用一个空行替换两个或多个空行?

dev*_*com 9 regular-expression ed

在 Ed 中,我可以进行搜索以替换所有空行,如下所示:

g/^$/d
Run Code Online (Sandbox Code Playgroud)

这将删除所有空行。但是如果我想删除两个或更多空行并保留 1 怎么办?例如:

Line 1


Line 2



Line 3
Run Code Online (Sandbox Code Playgroud)

变成:

Line 1

Line 2

Line 3
Run Code Online (Sandbox Code Playgroud)

Qua*_*odo 7

改编自Vim Wiki

ed -s file <<EOF
v/./.,/./-1j
w
q
EOF
Run Code Online (Sandbox Code Playgroud)
  • v/./: 选择所有与正则表达式不匹配的行.(即选择所有空行)。对它们执行以下操作:
    • .,/./-1j: join 命令应用于从选定行 ( .) 到下一个非空白行 ( /./-1)上方的行。
  • w q: 保存并退出。您可以%p Q改为仅显示输出而不修改文件。

虽然同样有效,但我最初的建议更为复杂:

printf '%s\n' 'g/^$/.,/./-1d\' 'i\' '' w q | ed -s file
Run Code Online (Sandbox Code Playgroud)

这个命令对单个global 命令使用两个命令(通常命令列表由一个命令组成),这需要在换行符前加上反斜杠作为其命令列表的前缀。

  • g/^$/: 选择所有空行。
    • .,/./-1d\:d从选定的行 ( .) 到下一个非空行 ( /./-1)上方的行。这将删除所有空行,所以
    • 'i\' '':i在上面插入一个新的空行。

相当于使用here-docs或 Printf 来喂养 Ed。只选择你最喜欢的那个。

参考:POSIX Ed