我在尝试更换比赛时遇到了麻烦。我的示例文件:
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
答案 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"