来自sed文档:
d Delete the pattern space; immediately start next cycle.
下一周期 是什么意思?我的理解是sed将不会在 d 命令之后应用以下命令,并且它开始从输入流中读取下一行并对其进行处理。但似乎这不是真的。见这个例子:
[root@localhost ~]# cat -A test.txt
aaaaaaaaaaaaaa$
$
bbbbbbbbbbbbb$
$
$
ccccccccc$
ddd$
$
eeeeeee$
[root@localhost ~]# cat test.txt | sed '/^$/d;p;p'
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
bbbbbbbbbbbbb
bbbbbbbbbbbbb
bbbbbbbbbbbbb
ccccccccc
ccccccccc
ccccccccc
ddd
ddd
ddd
eeeeeee
eeeeeee
eeeeeee
[root@localhost ~]#
如果 立即开始下一个周期 , p 命令将没有任何输出。
任何人都可以帮我解释一下吗?感谢。
答案 0 :(得分:8)
这意味着sed将读取下一行并开始处理它。
您的测试脚本没有按您的想法执行。它匹配空行并将delete命令应用于它们。它们没有出现,因此打印语句不会应用于空行。两个打印命令未连接到删除命令的模式,因此非空行打印三次。如果你改为尝试
sed '/./d;p;p' test.txt # matches all non-empty lines
除空白行外不会打印任何内容,每次打印三次。
答案 1 :(得分:1)
a)您可以将一个模式的多个命令与花括号组合使用:
sed '/^$/{d;p;p}' test.txt
aaaaaaaaaaaaaa
bbbbbbbbbbbbb
ccccccccc
ddd
eeeeeee
命令d仅适用于此处的空行:' / ^ $ / d; p; p'。否则,该行再打印2次。要将' p'命令绑定到模式,您必须构建花括号。然后跳过p命令,但由于跳到下一个循环,不是因为它不匹配。
b)无用的猫。 (已经显示)