我正在使用 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/