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…
可以正常工作。