我正在 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 次或 1 次)(至少)带有 ERE(扩展正则表达式),而不是BRE(基本正则表达式)。
sed
默认使用 BRE,因此标记按字面意思处理。
要启用 ERE,请将 -E
(或 -r
如果可用)与 sed
一起使用:
sed -E '/\.jp(e)?g/!d' myfile
捕获 e
在这里是多余的:
sed -E '/\.jpe?g/!d' myfile
请注意,您可以通过使用 \
将它们转义来使用来自 BRE 的 ERE token ,因此以下内容也可以工作:
sed '/\.jp\(e\)\?g/!d' myfile
sed '/\.jpe\?g/!d' myfile
同样,这看起来不像只使用一个选项(即 -E
)那么干净。只有可移植性才是您想要的。
关于bash - sed 无法匹配 0 次或 1 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44299073/