为什么这个 sed 命令不删除空行?
sed -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" -e '/^$/d' <<< $myvar
这个命令一切正常,除了最后一部分 -e '/^$/d' 用于删除似乎什么也不做的空行。这是我的内容示例:
begin dump
Ctrl_ID:100
这与使用 cat -A 查看的内容相同
begin dump$
$
Ctrl_ID:100$
使用十六进制编辑器检查空行表明它包含的只是一个具有十六进制值的字符
0A
每行末尾的代码完全相同。
我不明白这是怎么回事。
^$
应该匹配,不是吗?
答案1
试试这个(空行删除现在位于第一个位置):
sed -e '/^$/d' -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" <<< $myvar
负责空行删除不起作用的部分是:
-e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D'
更深入...
D 删除模式空间的内容,直到第一个换行符(如果没有换行符,则删除末尾),并开始新的循环。后者意味着如果 D 本身被执行,则 sed 程序中 D 之后的任何命令都不会被执行。
从这里