从sed文档:
d Delete the pattern space; immediately start next cycle.
Run Code Online (Sandbox Code Playgroud)
下一个周期意味着什么?我的理解是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 ~]#
Run Code Online (Sandbox Code Playgroud)
如果立即开始下一个循环,p命令将没有任何输出.
有人可以帮我解释一下吗?谢谢.
这意味着sed将读取下一行并开始处理它.
您的测试脚本没有按您的想法执行.它匹配空行并将delete命令应用于它们.它们没有出现,因此打印语句不会应用于空行.两个打印命令未连接到删除命令的模式,因此非空行打印三次.如果你改为尝试
sed '/./d;p;p' test.txt # matches all non-empty lines
Run Code Online (Sandbox Code Playgroud)
除空白行外不会打印任何内容,每次打印三次.