Sed不能正确替换我的文本

时间:2014-09-30 19:27:57

标签: regex sed

我在Sed中的以下正则表达式并没有提取我想要的文件而没有#30子字符串。 你能帮忙指出我在这里缺少什么吗?

[machine]# echo "//dir1/dir2/dir3/component/file.rb#70"  | sed  's/\(.*rb\)#\d+$/\1/g'

输出://dir1/dir2/dir3/component/file.rb#70

我想要的只是://dir1/dir2/dir3/component/file.rb没有#70子串。

提前致谢

PL

3 个答案:

答案 0 :(得分:4)

默认情况下sed所理解的正则表达式的风格并不包括数字\d或" 1或更多" +

这将有效:

sed 's/\(.*\.rb\)#[0-9][0-9]*$/\1/g'

或者你可以开启"扩展"使用-E的正则表达式语法,使+工作(但仍然不是\d),并交换反斜杠与非反斜括号的含义:

sed -E 's/(.*\.rb)#[0-9]+$/\1/g'

上面的两个命令都可以在非GNU sed上运行,因为在BSD和Mac OS X系统上默认使用。在正常模式下(没有-E),GNU sed在扩展模式下也理解\+与裸+相同,但BSD sed没有。

如果你想要做的就是摆脱#digits,你可以更简单地做到这一点。 Sed regex并没有固定在行的开头,所以你不必包含文件名 - 只需替换你根本不需要的部分:

sed 's/#[0-9][0-9]*$//'

sed -E 's/#[0-9]+$//'

如果您的真正问题确实需要花哨的版本,那么您也可以使用Perl,其优势在于版本中的正则表达式语法相对较少(几乎没有)更改。它还了解您尝试使用的\d语法:

perl -pe 's/(.*\.rb)#\d+$/\1/g'

答案 1 :(得分:2)

使用GNU sed,如果您使用-E并将\d更改为[0-9][[:digit:]],则您的命令有效:

echo "//dir1/dir2/dir3/component/file.rb#70" | sed -E 's/(.*rb)#[0-9]+$/\1/g'
//dir1/dir2/dir3/component/file.rb

根据上下文,您可以使用更简单的命令,例如

sed 's/#[0-9]\+//g'

答案 2 :(得分:0)

你得到了答案,但你只考虑过:

$ echo "//dir1/dir2/dir3/component/file.rb#70" | cut -d'#' -f1
//dir1/dir2/dir3/component/file.rb