【问题标题】:the 'd' command in the sed utilitysed 实用程序中的“d”命令
【发布时间】:2018-11-01 03:42:40
【问题描述】:

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

谁能帮我解释一下?谢谢。

【问题讨论】:

    标签: sed


    【解决方案1】:

    这意味着 sed 将读取下一行并开始处理它。

    您的测试脚本没有按照您的想法进行。它匹配空行并将删除命令应用于它们。它们不会出现,因此打印语句不会应用于空行。两个打印命令没有连接到删除命令的模式,所以非空行打印了 3 次。如果你改为尝试

    sed '/./d;p;p' test.txt # matches all non-empty lines
    

    除了空白行,不会打印任何内容,每次打印 3 次。

    【讨论】:

      【解决方案2】:

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

      sed '/^$/{d;p;p}' test.txt
      
      aaaaaaaaaaaaaa
      bbbbbbbbbbbbb
      ccccccccc
      ddd
      eeeeeee
      

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

      b) 无用的 cat。 (已经显示)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2019-09-03
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多