为什么这个sed命令不能正常工作?

时间:2016-08-29 04:42:09

标签: unix sed

我无法让([^/]+) sed正则表达式正常工作 它不返回所有非正斜杠字符,而只返回一个。

命令:

echo '/test/path/file.log' | sed -r 's|^.*([^/]+)/(.*)$|\1.\2|g'

预期:

path.file.log

结果:

h.file.log

也尝试了这个但得到了相同的结果:

echo '/test/path/file.log' | sed -r 's|^.*([^/]{1,})/(.*)$|\1.\2|g'

2 个答案:

答案 0 :(得分:2)

问题不在于[^/]+,而在于.*.*贪婪,并且会消耗最大量的输入。我通常的建议是使用.*?使其非贪婪,但POSIX正则表达式不支持该语法。

如果总是有斜杠,你可以在正则表达式中添加一个斜杠来阻止它消耗太多。

$ echo '/test/path/file.log' | sed -r 's|^.*/([^/]+)/(.*)$|\1.\2|g'
path.file.log

答案 1 :(得分:0)

操作系统使用不同版本的sed。默认情况下,某些sed版本使用基本的regexp语法;如果您需要扩展的正则表达式语法(+是其中一项功能),那么您需要使用-E切换选项。