sed - 替换包含两个通配符的匹配

时间:2016-06-19 14:23:48

标签: sed

我在尝试更换比赛时遇到了麻烦。我的示例文件:

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"

....如果我在(.*\)之后的第二个通配符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"

...其中模式匹配不再匹配的行因为没有被空格拖尾而不再被替换(不好),并且包含空格和更多文本的行后面找到{{ 1}}作为唯一剩下的文本,但我认为它会留下所有-g尾随文本。

任何-p /var/run/ntpd.pid -g位专家,我们都欢迎任何/所有指导。我期望的结果将是:

sed

3 个答案:

答案 0 :(得分:1)

此命令应该这样做:

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命令变得更具可读性:

sed -r 's/-u( [^:]{1,}:[^ ]{1,})/-u ntp:ntp/' file

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/-u\s\S+:\S+/-u ntp:ntp/' file

使用\s表示空格,使用\S表示非空格,使用限定符+表示一个或多个前面的字符或字符类,正则表达式匹配一个-u后跟一个空格,后跟一个或多个非空格,后跟一个:,后跟一个或多个非空格。

答案 2 :(得分:0)

所有提议的答案都在一定程度上起作用,但两者都有问题(尾部"被错误地删除)。

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"