我正在使用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
找不到任何解释此内容的内容。
为什么会发生这种情况,有什么方法吗?
答案 0 :(得分:6)
documentation的简短摘录:
-i[SUFFIX]
--in-place[=SUFFIX]
此选项指定要就地编辑文件。
当你写:
sed -ir '...'
sed
将命令行解释为-i
,后跟用于备份文件的后缀(上面摘录中提供的简短格式)。
因此,它不再看到-r
选项,并将最后一个参数解释为基本regex
而不是扩展regex
。正如同一文档页面所说,"扩展正则表达式[...]可以更清晰,因为它们通常具有更少的反斜杠" 。
解决方案非常简单:单独添加-i
命令行选项,不要将其与-r
结合使用:
sed -i -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi'
(无法合并具有参数的命令行选项。)
答案 1 :(得分:1)
这是因为-i
选项需要文件参数。如果您将参数切换为-ri
,则会看到错误。将其作为-ir
告诉sed从文件r
读取,因此它不使用通过-r
选项启用的扩展正则表达式选项。