首页 > 解决方案 > 使用 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]\+\).*/"\1",/g'

输出如下:

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

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

标签: regexlinuxsedsysadmin

解决方案


这是因为.*您的第二个 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'

推荐阅读