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

时间:2011-11-22 12:00:19

标签: sed

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

任何人都可以帮我解释一下吗?感谢。

2 个答案:

答案 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)无用的猫。 (已经显示)