我在Cent OS7上写了一个bash脚本。现在,我需要使用sed
删除所有不包含.jpg
或.jpeg
的行。
这是我的剧本:
sed -i -e '/\.jp(e)?g/!d' myfile
但它会删除所有行,这意味着它没有按预期工作。
但是,如果我sed -i -e '/\.jpg/!d' myfile
或sed -i -e '/\.jpeg/!d' myfile
。两者都运作良好。
答案 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