【问题标题】:Sed removes matches from output [duplicate]Sed从输出中删除匹配项[重复]
【发布时间】:2014-11-06 13:54:02
【问题描述】:

我正在尝试提取以数字 3 开头的进程号。

使用ps | sed "/^\s\+3/" 时,我收到一条错误消息:sed: -e expression #1, char 8: missing command

然后我添加了一个全局标志:ps | sed "/^\s+3/g",它成功了,但它没有显示所有匹配项,而是删除了所有找到的匹配项。

这是未更改的输出:

  PID TTY          TIME CMD
 3128 pts/8    00:00:00 bash
 5279 pts/8    00:00:00 ps
 5280 pts/8    00:00:00 sed

最后,这是我得到的输出: PID TTY 时间命令

 5219 pts/8    00:00:00 ps
 5220 pts/8    00:00:00 sed

【问题讨论】:

    标签: regex bash sed ps


    【解决方案1】:

    您需要添加-n 参数来打印与特定模式匹配的行。请注意,基本 sed 不支持模式 \s(用于匹配空格)。

    ps | sed -n '/^ *3/p'
    

    ps | sed -n '/^[[:blank:]]*3/p'
    

    【讨论】:

    • 从手册页中,-n 是:禁止自动打印模式空间。在这里压制不是我们想要的相反吗? (顺便说一句,这行得通,但我很难理解)
    • sed 逐行读取输入。因此它在对该特定行进行任何操作之前将行附加到模式空间。 S 如果/^ *3/ 与 ps 中存在的行匹配,则 -n 和 p 会自动打印这些行。
    • 另一种方法是ps | sed '/^ *3/!d' 我尝试在编辑中添加答案(因为它太相似而不能单独作为答案,而且问题已关闭)但它被拒绝了:(
    【解决方案2】:

    听起来 sed 并不是真正适合这项工作的工具。试试 awk:

    ps | awk '$1 ~ /^3/'
    

    这会打印第一列以 3 开头的所有行。

    【讨论】:

    • 谢谢,但使用 sed 确实是我在这里寻找的东西 :) +1 无论如何
    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多