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

时间:2015-06-30 12:55:41

标签: 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找不到任何解释此内容的内容。

为什么会发生这种情况,有什么方法吗?

2 个答案:

答案 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选项启用的扩展正则表达式选项。