您可以sed
通过删除不需要的位来提取所需的字段:
pax> echo 'junk node:9-72-1408 more junk port:323 last junk'
| sed -E 's/^.*(node:[0-9]+-[0-9]*-[0-9]*).*(port:[0-9]+).*$/\1 \2/'
node:9-72-1408 port:323
这些.*
位仅代表任何垃圾,括号用于“捕获”匹配的文本,以便可以在替换中使用它(as\1
和\2
)。
侧边栏:
如果您的版本sed
不支持-E
扩展正则表达式,它可能支持-r
,就像某些版本的 GNU 一样sed
。
否则,您需要转义括号和+
字符:
pax> echo 'junk node:9-72-1408 more junk port:323 last junk'
| sed 's/^.*\(node:[0-9]\+-[0-9]\+-[0-9]\+\).*\(port:[0-9]\+\).*$/\1 \2/'
node:9-72-1408 port:323
GNU sed 的源代码包含这个小片段:
/* Undocumented, for compatibility with BSD sed. */
case 'E':
case 'r':
但这似乎是在 4.2 中引入的(即,它在 4.2 中,但不是在 4.1.5 中,这是 4.1 系列的最后一个)。有关详细信息,请参见此处。
而且,如果您需要变量中的实际值,您可以使用以下内容:
pax> inpstr='junk-here node:9-72-1408 more-junk port:323 last-junk'
pax> node=$(echo "$inpstr" | sed -E 's/^.*node:([0-9]+-[0-9]+-[0-9]+).*$/\1/')
pax> port=$(echo "$inpstr" | sed -E 's/^.*port:([0-9]+).*$/\1/')
pax> echo $inpstr
junk-here node:9-72-1408 more-junk port:323 last-junk
pax> echo $node
9-72-1408
pax> echo $port
323
(考虑到早期关于使用-r
或添加额外转义用于“较小”sed
实现的评论)。