Sed" +"量词似乎与任何东西都不匹配

时间:2016-08-02 13:05:43

标签: sed

我有一个带有内容的文件sedTest.txt:

sdjalsh ABC 123 ashfaladhs
ldjkasf ABC 234 dadas afsf
dafsafs ABC 876 asf dasfaf

我想仅输出123234876

我可以使用

进行管理
cat sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"

我用那种方式,因为通常有grep而不是cat,在这种情况下它可能是

grep ABC sedTest.txt | sed s"/.*ABC \([0-9]+\).*/\1/"

这在这里没有意义,但这是日志的典型用法。

我想知道:为什么使用[0-9]+无效?我期望得到与[0-9]*相同的结果,但似乎没有任何内容被替换(并且打印出未更改的内容)。

1 个答案:

答案 0 :(得分:2)

+是ERE元字符,sed默认使用BRE。使用sed -E ... + ...sed ... \+ ...启用+的ERE属性,例如

grep 'ABC' sedTest.txt | sed -E 's/ABC ([0-9]+).*/\1/'

并注意,当您使用-E并且前导.*没有做任何有用的事情时,您不再需要逃避parens以启用其ERE元字符属性,因此我将其删除。另外,你不需要grep + sed,这样做:

sed -E -n 's/ABC ([0-9]+).*/\1/p' sedTest.txt

但更重要的是你应该真正使用:

awk '$2=="ABC"{print $3}' sedTest.txt

代替清晰度,简洁性,稳健性,可移植性等。

请注意,您应将脚本(sed,awk,grep等)用单引号(')括起来,而不是双倍("),除非您在shell决定解释某些内容时感到惊喜在工具看到它们之前,脚本中的值。