2017-06-01 56 views
2

我在Cent OS7上编写了一个bash脚本。现在我需要使用sed删除所有不包含.jpg.jpeg的行。
sed不能匹配0或1次

这里是我的脚本:

sed -i -e '/\.jp(e)?g/!d' myfile 

但它会删除所有的行,这意味着预期这是行不通的。

但是,如果我做​​或sed -i -e '/\.jpeg/!d' myfile。他们两人都很好。

回答

3

捕获组(())和量词?(匹配前面的令牌0或1次)至少带有ERE(扩展RegEx),而不是BRE(基本RegEx)。

sed默认情况下使用BRE,所以令牌被字面处理。

要启用ERE,使用-E(或-r如可用)sed

sed -E '/\.jp(e)?g/!d' myfile 

捕获e是在这里重复:

sed -E '/\.jpe?g/!d' myfile 

需要注意的是,你可以使用ERE令牌从BR​​E逃脱他们与\,所以下面也可以工作:

sed '/\.jp\(e\)\?g/!d' myfile 
sed '/\.jpe\?g/!d' myfile 

再一次,这看起来不像只使用一个选项即-E那样干净。只有你想要这样的情况才是可移植性。

0

sed命令中使用正则表达式可能符合您的要求,零或一个'e'将按照以下所示过滤。

sed -i -e '/jpe\?g/!d' myfile

0

这可能为你工作(GNU SED):

sed '/\.jp\(e\|\)g/!d' file 

使用交替,其中交替的一个是空的。

或许更容易地看到,如果交替列:

sed '/\.jpeg\|\.jpg/!d' file 

然而,由于已经说明,使用?

sed '/\.jpe\?g/!d' file 

注: *是零个或多个即

sed '/\.jpe*g/!d' file 

将允许.jpeeeeeeeeeeeeeeeeg

相关问题