regex - 为什么带有 -i 的 gnu-sed 需要转义所有内容?

标签 regex bash sed

我正在使用 gnu-sed,我发现了以下内容:

sed -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi' test.txt

如果没有 -i,这将正常工作并匹配 test.txt 中的以下行:

https://www.example.com.au

但是,如果我添加 -i,我需要转义几乎所有内容(甚至是问号)才能获得相同的结果。它最终看起来像:

     sed -ir 's|\(\(https\?://\)\?\(www\.\)\?\)example\.com\.au|\1|gi' test.txt
#COMP:sed -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi' test.txt

这更丑了...我不喜欢它:(

我在 man sed 中找不到任何解释这一点的内容。

为什么会发生这种情况,有什么解决办法吗?

最佳答案

documentation 的简短摘录:

-i[SUFFIX]
--in-place[=SUFFIX]
This option specifies that files are to be edited in-place.

当你写的时候:

sed -ir '...'

sed 将命令行解释为 -i 后跟用于备份文件的后缀(上述摘录中的缩写形式)。

因此,它不再看到 -r 选项并将最后一个参数解释为基本 regex 而不是扩展的 regex。正如同一个文档页面所说,“扩展的正则表达式 [...] 可以更清晰,因为它们通常有较少的反斜杠”

解决方案非常简单:单独添加您的-i 命令行选项,不要将它与-r 结合使用:

sed -i -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi'

(不能组合带有参数的命令行选项。)

关于regex - 为什么带有 -i 的 gnu-sed 需要转义所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31138909/

相关文章:

javascript - RegEx - 从逗号分隔的字符串中提取包含子字符串的单词

bash:jq 选择中的日期比较和结果导向

linux - 更改大括号样式的 Bash 脚本

linux - sed 删除 svn 访问控制列表中的用户

bash - 如何打印包含两个匹配两种不同模式的文件的目录?

linux - 如何删除图案线之间的所有线

javascript - 搜索条件的正则表达式

javascript - 如何在 Cypress 中使用 RegExp 验证电话号码?

ruby - 识别空格与其他字符在字符串中运行

linux - 实现Java数据分析工具时的Bash错误