使用sed时缺少空格

问题描述 投票:2回答:1

所以我将lsof与jq结合使用以转换为json。原始输出示例:

  [
    "blah",
    "1234",
    "yoda",
    "561u",
    "IPv4",
    "297229000",
    "0t0",
    "TCP",
    "15.60.74.17:1511",
    "(LISTEN)"
  ]
]

与sed一起使用时:

sed -e "s/(//" -e "s/)//" | sed 's/.*:\([0-9]\+\).*/"\1",/g'

输出结果为:

  [
    "blah",
    "1234",
    "yoda",
    "561u",
    "IPv4",
    "297229000",
    "0t0",
    "TCP",
"1511",
    "LISTEN"
  ]
]

注意:没有为“ 1511”保留空间,不确定我缺少什么,我确定有些愚蠢,有人知道我在这里缺少什么吗?

regex linux sed sysadmin
1个回答
0
投票

这是因为第二个sed命令中的第一个.*。您可以使用这样的东西来预装空格:

sed -e "s/(//" -e "s/)//" | sed 's/\S*:\([0-9]\+\).*/"\1",/g'

我所做的是...我可以解释,但是如果您自己弄清楚,那会更有趣;)

编辑:好的,我这样说:第二个sed的正则表达式与第一个非空白字符匹配(\S表示不是空白,它与\s相反)。因此,您的第二个sed与值之前的空格不匹配。

如果我处于您的位置,则不会将sed用于此任务。使用Python之类的工具取消JSON输入的编组,然后以这种方式使用值将是一种更加自信的方法。就是说,如果必须使用sed进行操作,我将像这样重写第二个sed:

sed -e "s/(//" -e "s/)//" | sed 's/".*:\([0-9]\+\)",$/"\1",/g'
© www.soinside.com 2019 - 2024. All rights reserved.