sed无法匹配0或1次

时间:2017-06-01 05:19:24

标签: bash shell sed

我在Cent OS7上写了一个bash脚本。现在,我需要使用sed删除所有不包含.jpg.jpeg的行。

这是我的剧本:

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

但它会删除所有行,这意味着它没有按预期工作。

但是,如果我sed -i -e '/\.jpg/!d' myfilesed -i -e '/\.jpeg/!d' myfile。两者都运作良好。

3 个答案:

答案 0 :(得分:6)

捕获的组(())和量词?(匹配前面的标记0或1次)来自(至少)ERE(扩展RegEx),而不是BRE(基本RegEx)。 / p> 默认情况下,

sed使用BRE,因此字面上会对令牌进行处理。

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

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

捕获e在这里是多余的:

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

请注意,您可以使用\转义来使用BRE中的ERE令牌,因此以下内容也可以使用:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

这可能适合你(GNU sed):

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

使用其中一个替换为空的交替。

也许更容易看出是否列出了替代品:

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

但是,如前所述,请使用?

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

N.B。 *为零或更多,即

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

允许.jpeeeeeeeeeeeeeeeeg