sed实用程序中的'd'命令

13

来自 sed 文档:

d      Delete the pattern space; immediately start next cycle.

什么是 next cycle 的意思?我的理解是在 d 命令后面的命令不会被执行,sed会从输入流中读取下一行并处理它。但是实际情况好像并不是这样的。请看以下示例:

[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 命令将没有任何输出。

有人可以帮我解释一下吗?谢谢。

2个回答

11
这意味着sed将读取下一行并开始处理它。
你的测试脚本并不像你想的那样工作。它匹配空行并对其应用删除命令。它们不会显示出来,所以打印语句不会应用于空行。两个打印命令与删除命令的模式没有连接,所以非空行会被打印三次。如果你尝试使用以下方式:
sed '/./d;p;p' test.txt # matches all non-empty lines

除了空行,每个都会打印三次,不会打印任何其他内容。

3

a) 您可以使用花括号将多个命令组合为一个模式:

sed '/^$/{d;p;p}' test.txt

aaaaaaaaaaaaaa
bbbbbbbbbbbbb
ccccccccc
ddd
eeeeeee

这里的命令d仅适用于空行:'/^$/d;p;p'。否则,该行将被打印2次。要将“p”命令绑定到模式,您必须构建花括号。然后,p命令也被跳过,但是由于跳转到下一个周期而不是因为它不匹配。

b) 无用的cat使用。(已经展示)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接