使用sed时缺少空间

时间:2020-02-27 19:25:19

标签: regex linux sed sysadmin

因此,我将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”保留空间,不确定我缺少什么,我确定有些愚蠢,有人知道我在这里缺少什么吗?

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

请尝试以下操作:

sed -e 's/(\([^)]*\))/\1/' -e 's/[[:digit:].]*:\([[:digit:]]\+\)/\1/'
  • 第一个正则表达式(\([^)]*\))与被括号包围的子字符串匹配,并且该子字符串在\1中被捕获。
  • 第二个正则表达式[[:digit:].]*:\([[:digit:]]\+\)匹配由数字和/或点组成的子字符串,后跟冒号:,然后是另一个数字序列。数字,点和冒号的开头部分已删除。
相关问题