首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用-i的gnu需要转义所有的东西?

为什么使用-i的gnu需要转义所有的东西?
EN

Stack Overflow用户
提问于 2015-06-30 12:55:41
回答 2查看 49关注 0票数 2

我正在与gnu-sed合作,我发现了以下内容:

代码语言:javascript
复制
sed -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi' test.txt

如果没有-i,这将很好地工作,并与test.txt中的下面一行相匹配

代码语言:javascript
复制
https://www.example.com.au

但是,如果我添加了-i,我需要避开几乎所有的东西(,甚至问号)才能获得相同的结果。最后看起来是这样:

代码语言:javascript
复制
     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中找不到任何东西来解释这一点。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-30 13:06:41

文档的一个简短的节选

-i[SUFFIX] --in-place[=SUFFIX] 此选项指定要就地编辑文件.

当你写:

代码语言:javascript
复制
sed -ir '...'

sed将命令行解释为-i,后跟用于备份文件的后缀(在上面的节选中显示的简短形式)。

因此,它不再看到-r选项,而是将最后一个参数解释为基本的regex,而不是扩展的regex。正如同一文档页所述,"Extended .可能更清楚,因为它们通常有较少的反斜杠“。

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

代码语言:javascript
复制
sed -i -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi'

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

票数 6
EN

Stack Overflow用户

发布于 2015-06-30 13:01:11

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31138909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档