bash - sed 无法匹配 0 次或 1 次

标签 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。它们都很好用。

最佳答案

捕获组 (()) 和量词 ?(匹配前面的标记 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/

相关文章:

windows - bash 变量只保留 grep 的最后一行

bash - 如何将 shell 变量导出到所有 session ?

c - 系统 ("echo text > t.log") 报告错误

awk - 用文件内容替换字符串

sed 用下划线替换破折号,直到到达字符

python - 将成员/变量从 python 脚本传递到 shell 脚本或命令

bash - 在 perl unpack 中解析 unicode 字符串的结果不一致

linux - TFS 2017 - 在 shell 脚本中使用双反斜杠进行变量替换

regex - 替换文件中的\n\t 模式

bash - 函数在 bash 脚本中不起作用 - 错误消息与 '\r' 相关