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)
改编自Vim Wiki:
ed -s file <<EOF
v/./.,/./-1j
w
q
EOF
Run Code Online (Sandbox Code Playgroud)
v/./
: 选择所有与正则表达式不匹配的行.
(即选择所有空行)。对它们执行以下操作:
.,/./-1j
: j
oin 命令应用于从选定行 ( .
) 到下一个非空白行 ( /./-1
)上方的行。w q
: 保存并退出。您可以%p Q
改为仅显示输出而不修改文件。虽然同样有效,但我最初的建议更为复杂:
printf '%s\n' 'g/^$/.,/./-1d\' 'i\' '' w q | ed -s file
Run Code Online (Sandbox Code Playgroud)
这个命令对单个g
lobal 命令使用两个命令(通常命令列表由一个命令组成),这需要在换行符前加上反斜杠作为其命令列表的前缀。
g/^$/
: 选择所有空行。
.,/./-1d\
:d
从选定的行 ( .
) 到下一个非空行 ( /./-1
)上方的行。这将删除所有空行,所以'i\' ''
:i
在上面插入一个新的空行。相当于使用here-docs或 Printf 来喂养 Ed。只选择你最喜欢的那个。
参考:POSIX Ed。