太贪心了(+ vs *)

时间:2014-08-12 16:13:31

标签: sed greedy

我有这样的台词:

scaffold157|size21652:7243-9055/0_1813 10 -2127 86.5772 0 272 854 1813 1 185842 186425 147764049 254

我需要从“/”中删除部分直到字边界(第一个标签),所以在我的例子中这部分:

/0_1813

有了这个结果:

scaffold157|size21652:7243-9055 10 -2127 86.5772 0 272 854 1813 1 185842 186425 147764049 254

然而,我的sed似乎过于贪心了

 sed 's/\/0_.*\b//'
吃完所有的专栏。但是,使用。+,命令根本不起作用,并且不会替换任何内容。我究竟做错了什么?为什么。+不工作?

3 个答案:

答案 0 :(得分:2)

.+行为方式的原因是+只是ERE中的元字符,sed默认使用BRE,所以除非您通过添加-r或转义启用ERE因为\+ sed认为+只是字面加字符。

但这是一个不错的选择,你只需要:

$ sed 's|/[^[:space:]]*[[:space:]]*||' file
scaffold157|size21652:7243-905510 -2127 86.5772 0 272 854 1813 1 185842 186425 147764049 254

在某些seds中,您可以将[[:space:]]替换为\s,将[^[:space:]]替换为\S,例如: GNU。

答案 1 :(得分:1)

匹配数字:

sed 's/\/0_[0-9]*//'

或否定空格:

sed 's/\/0_[^ \t]*//'
sed 's/\/0_[^[:blank:]]*//'
sed -r 's/\/0_\S*\b//'

可能使用否定空格,不再需要\b

答案 2 :(得分:1)

  

我需要从“/”中删除部分,直到字边界(第一个标签)

这里这个单行提供了您的预期输出:

sed -r 's#/\S*\b##'