Regex 为什么gnu使用-我要求所有东西都被转义?

Regex 为什么gnu使用-我要求所有东西都被转义?,regex,bash,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\.\)\?\)examp

我正在使用
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
中找不到任何东西来解释这一点


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

这是因为
-i
选项需要一个文件参数。如果将参数切换到
-ri
,您将看到错误。将其作为
-ir
告诉sed从文件
r
读取,因此它不会使用扩展的regex选项通过
-r
选项启用。

以下内容的简短摘录:

-i[后缀]

--就地[=后缀]

此选项指定要在位编辑的文件

当你写作时:

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

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

解决方案非常简单:单独添加
-i
命令行选项,不要将其与
-r
组合:

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

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

哦,对不起@mart1n,实际上我提供了一个文件给它,但除非我添加所有的斜杠,否则它不会匹配并编辑该文件。我会编辑这个问题。哦,我现在明白了!对不起,这是正确的,我只是花了一段时间才发现
-I
本身需要的是一个文件,而不是整个脚本。@mart1n,你说的“将其作为
-ir
告诉sed从文件
r
..”它不会这样做!它将
-ir
中的
r
视为后缀,如“-i[后缀]“从axiac的正确答案所示的手册页中。
sed-ir PATTERN file.txt
在编辑前将
file.txt
备份到
file.txtr
,因此具有参数的命令行选项不能组合。”这并不完全正确;带有参数的选项可以跟随非参数选项,因此
sed-ri…
可以正常工作。