我在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
答案 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