首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包含两个通配符的替换匹配

包含两个通配符的替换匹配
EN

Stack Overflow用户
提问于 2016-06-19 14:23:47
回答 3查看 64关注 0票数 0

我想换个火柴有点麻烦了。我的示例文件:

cat ntpd

代码语言:javascript
复制
OPTIONS="-g"
OPTIONS="-u ntg:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u root:root -p /var/run/ntpd.pid -g"
OPTIONS="-u root:root"
OPTIONS="-u"

我想用"-u *:*“替换为"-u ntp:ntp

我试过以下几种变体:

代码语言:javascript
复制
sed 's/-u\ \(.*\)\:\(.*\)/-u ntp:ntp/g' ntpd

但是这给了我结果,在替换字符串之后的所有东西都丢失了:

代码语言:javascript
复制
OPTIONS="-g"
OPTIONS="-u ntp:ntp
OPTIONS="-u ntp:ntp
OPTIONS="-u ntp:ntp
OPTIONS="-u"

....if,我在第二个通配符(.*\) (如sed 's/-u\ \(.*\)\:\(.*\) /-u ntp:ntp/g' ntpd )之后添加了一个空格,奇怪的是,结果如下:

代码语言:javascript
复制
OPTIONS="-g"
OPTIONS="-u ntp:ntp-g"
OPTIONS="-u ntp:ntp-g"
OPTIONS="-u root:root"
OPTIONS="-u"

...where是模式匹配不再匹配的行,因为它不再被空格所跟踪(不太好),包含空格和后面更多文本的行将发现-g是唯一的剩馀文本,但我认为它会留下所有的-p /var/run/ntpd.pid -g拖尾文本。

任何sed专家,如有任何/所有的指导,将不胜感激。我想要的结果是:

代码语言:javascript
复制
OPTIONS="-g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u ntp:ntp"
OPTIONS="-u"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-19 23:52:46

所有建议的答案都在一定程度上有效,但两者都有问题(落后的"被错误地删除了)。

代码语言:javascript
复制
OPTIONS="-g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u ntp:ntp
OPTIONS="-u"

然而,该评论提供了@melpomene的答复是第一反应和最终解决方案,至少在这个案例。

使用sed 's/-u\ [a-zA-Z0-9_-]*:[a-zA-Z0-9_-]*/-u ntp:ntp/g' ntpd

所期望的结果:

代码语言:javascript
复制
OPTIONS="-g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u ntp:ntp"
OPTIONS="-u"
票数 0
EN

Stack Overflow用户

发布于 2016-06-19 14:27:56

这个命令应该这样做:

代码语言:javascript
复制
sed 's/-u\( [^:]\{1,\}:[^ ]\{1,\}\)/-u ntp:ntp/' file

输出:

代码语言:javascript
复制
OPTIONS="-g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
OPTIONS="-u"

顺便说一句,使用带有-r的扩展posix正则表达式,命令变得更加可读性了:

代码语言:javascript
复制
sed -r 's/-u( [^:]{1,}:[^ ]{1,})/-u ntp:ntp/' file
票数 1
EN

Stack Overflow用户

发布于 2016-06-19 20:32:14

这可能对您有用(GNU sed):

代码语言:javascript
复制
sed -r 's/-u\s\S+:\S+/-u ntp:ntp/' file

使用\s表示一个空格,使用\S表示一个非空间,使用限定符+表示一个或多个前字符或字符类,regexp匹配一个-u,后面是一个空格,然后是一个或多个非空格,然后是:,然后是一个或多个非空格。

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

https://stackoverflow.com/questions/37908242

复制
相关文章

相似问题

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