2016-08-02 173 views
0

有人可以帮助我了解,为什么这不起作用?sed +/*不按预期工作

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

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

我想输出,只是那些123,234,876

我可以管理,使用

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

我用这种方式,因为通常有grep而不是猫,它可能是

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

这使得这里不是一个真正的感觉,但这是。典型原木使用...

我想知道的是,为什么使用[0-9] +不工作,我期望相同的结果至于[0-9] *,但似乎没有任何内容被替换(并且未打印内容)。

请随时问我是否需要指定缺少的东西。

回答

2

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

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

,请注意您不再需要为了躲避括号,以使他们的ERE元字符属性,当您使用-E和领先.*在做,所以我摆脱它没什么用处。此外,你不需要的grep sed的+,这是不行的:

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

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

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

而不是为清晰,简单,鲁棒性,便携性等。除非你喜欢当shell在您的工具之前决定解释脚本中的某些值时的惊喜,否则应该在单引号(')中包含脚本(sed,awk,grep,不管),而不是双精度(")看到他们。

+0

感谢您澄清这一点。你能否添加一些描述EREs/BREs更详细的链接(或其他的参考资料)。在您的帖子后,我注意到这个缩写在sed手册页... – Betlista

+0

不,只是谷歌他们。理解BREs/EREs是编写shell脚本的基础,为这些添加链接就像添加链接来描述“if”和“then”。 –