使用 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 点组成的子字符串,后跟一个冒号 :
然后是另一个数字序列。删除了数字、点和冒号的前导部分。
所以我将 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 点组成的子字符串,后跟一个冒号:
然后是另一个数字序列。删除了数字、点和冒号的前导部分。