可以使用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
的.*
位只是代表任何垃圾和括号是用来“捕捉”匹配的文本,从而可用于更换(如\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系列中的最后一个)。详情请参阅here。
而且,如果你需要在变量的实际值,可以使用类似:
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
实现)。
谢谢。我试过这个命令,但它似乎在我的系统中不起作用。我不知道为什么,在sed中没有-E选项,我的系统中的sed版本是GNU sed version 4.1.5。我尝试了男性sed,它只有-e或-expression,我也试过,但它没有给我预期的结果。它在's'命令的RHS“ – user1285419 2012-07-24 02:43:54
@ user1285419上显示”sed:-e表达式#1,字符57:无效引用\ 2,请尝试使用扩展正则表达式而不是'-E'。 '-E'在我的GNUsed4.2.1上工作,即使它不在联机帮助页中。否则,你将不得不稍微修改正则表达式。我会更新答案。 – paxdiablo 2012-07-24 03:06:53
@ user1285419:此外,'-E'开关已添加到4.2版本,这解释了为什么4.1.x没有它。但是,由于4.1.0具有'-r',因此您可以直接使用它。 – paxdiablo 2012-07-24 03:34:46