我想换个火柴有点麻烦了。我的示例文件:
cat ntpd
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”
我试过以下几种变体:
sed 's/-u\ \(.*\)\:\(.*\)/-u ntp:ntp/g' ntpd但是这给了我结果,在替换字符串之后的所有东西都丢失了:
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 )之后添加了一个空格,奇怪的是,结果如下:
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专家,如有任何/所有的指导,将不胜感激。我想要的结果是:
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"发布于 2016-06-19 23:52:46
所有建议的答案都在一定程度上有效,但两者都有问题(落后的"被错误地删除了)。
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
所期望的结果:
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"发布于 2016-06-19 14:27:56
这个命令应该这样做:
sed 's/-u\( [^:]\{1,\}:[^ ]\{1,\}\)/-u ntp:ntp/' file输出:
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正则表达式,命令变得更加可读性了:
sed -r 's/-u( [^:]{1,}:[^ ]{1,})/-u ntp:ntp/' file发布于 2016-06-19 20:32:14
这可能对您有用(GNU sed):
sed -r 's/-u\s\S+:\S+/-u ntp:ntp/' file使用\s表示一个空格,使用\S表示一个非空间,使用限定符+表示一个或多个前字符或字符类,regexp匹配一个-u,后面是一个空格,然后是一个或多个非空格,然后是:,然后是一个或多个非空格。
https://stackoverflow.com/questions/37908242
复制相似问题