使用 sed 时缺少 space

Missing space when using sed

所以我将 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]\+\).*/"",/g'

输出结果为:

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

请注意,space 没有为“1511”保留,不确定我遗漏了什么,我确定有些愚蠢,有人知道我在这里遗漏了什么吗?

这是因为您的第二个 sed 命令中的第一个 .*。你可以像这样保留空格:

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

我所做的是......我可以解释,但如果你自己弄明白会更有趣;)

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

如果我处于您的位置,我不会使用 sed 来完成这项任务。使用 Python 之类的工具解组 JSON 输入并以这种方式处理值将是一种更有信心的方法。也就是说,如果我必须用 sed 来做,我会像这样重写第二个 sed:

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

你可以使用一个寄存器,但是少匹配会更容易:

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

顺便说一句,您不需要 2 个 sed - 只需一个带有两个 -e 即可。

请您尝试以下操作:

sed -e 's/(\([^)]*\))//' -e 's/[[:digit:].]*:\([[:digit:]]\+\)//'
  • 第一个正则表达式 (\([^)]*\)) 匹配一个由括号包围的子字符串,该子字符串在 </code>.</li> 中捕获 <li>第二个正则表达式 <code>[[:digit:].]*:\([[:digit:]]\+\) 匹配由数字 and/or 点组成的子字符串,后跟一个冒号 : 然后是另一个数字序列。删除了数字、点和冒号的前导部分。