正则表达式:不匹配组而不是单个字符

时间:2014-10-26 04:06:29

标签: regex sed

echo test.a.wav|sed 's/[^(.wav)]*//g'
.a.wav

我想要的是删除每个字符,直到它到达整个组.wav(也就是说,我希望结果为.wav),但似乎sed将删除每个字符,直到它到达四个字符中的任何一个。如何做到这一点?

4 个答案:

答案 0 :(得分:1)

组在 [] 中不起作用,因此点是该类的一部分,就像parens一样。

怎么样:

echo test.a.wav|sed 's/.*\(\.wav\)/\1/g'

请注意,可能还有其他有效的解决方案,但您没有提供有关您尝试执行的操作的上下文,以确定最佳解决方案。

答案 1 :(得分:1)

sed否定前瞻)不支持您要求的功能,但Perl可以解决此问题。

$ echo 'test.a.wav' | perl -pe 's/^(?:(?!\.wav).)*//g'
.wav

答案 2 :(得分:1)

您可以使用awk代替正则表达式:

echo test.a.wav.more | awk -F".wav" '{print FS$2}'
.wav.more

它将数据与您的模式分开,然后打印模式和其余数据。

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed ':a;/^\.wav/!s/.//;ta;/./!d' file

或:

sed 's/\.wav/\n&/;s/^[^\n]*\n//;/./!d' file

N.B。如果该行为空,则删除该行。如果不需要,只需从上述命令中删除/./!d

相关问题