sed无法匹配0或1次

Yve*_*ves 6 bash shell sed

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

这是我的脚本:

sed -i -e '/\.jp(e)?g/!d' myfile
Run Code Online (Sandbox Code Playgroud)

但它会删除所有行,这意味着它不能按预期工作.

但是,如果我这样做sed -i -e '/\.jpg/!d' myfilesed -i -e '/\.jpeg/!d' myfile.它们都运作良好.

hee*_*ayl 8

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

sed 默认情况下使用BRE,因此字体处理令牌.

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

sed -E '/\.jp(e)?g/!d' myfile
Run Code Online (Sandbox Code Playgroud)

捕获e在这里是多余的:

sed -E '/\.jpe?g/!d' myfile
Run Code Online (Sandbox Code Playgroud)

请注意,您可以通过使用它们来使用来自BRE的ERE令牌\,因此以下内容也可以使用:

sed '/\.jp\(e\)\?g/!d' myfile
sed '/\.jpe\?g/!d' myfile
Run Code Online (Sandbox Code Playgroud)

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