想要使用 Awk 和 Sed 比较配置参数并在值不同时替换
Want to compare a config parameter and replace if value is different using Awk and Sed
有一个包含键值的配置文件
key1=1
key2=2
key5=6
想把key5不是5的值替换为10
awk '
BEGIN{FLAG=0}
/key5=6/{FLAG=1}
END { if (FLAG == 0) {sed -i "s/^key5.*/key5=10/1"
print "key5 is now 10" } }' test.config
代码在不同的行上。另外,忽略开始和结束双引号。使用此编辑器无法正确完成。
sed 命令不起作用,我是否正确转义了它?
sed 本身在命令行上运行良好
此答案假定您的配置文件的键值对实际上每个都在单独的一行上,这正是您的 awk
命令所建议的。
看起来您正试图在 程序中直接从 调用 sed
,这不会起作用 - 唯一的方法从 awk
调用其他实用程序是使用 system()
函数或管道 ("<cmd>" | getline ...
)。
但是,这很少是正确的方法;相反,使用 awk
修改输入字段的能力:
awk 'BEGIN{ FS=OFS="=" } =="key5" && !=5 { = 10 } { print }' test.config
BEGIN{ FS=OFS="=" }
告诉 awk
按 =
(FS
) 将每个输入行拆分为多个字段,并用 =
(=
( OFS
)。
OFS
适用于将 print
与多个参数一起使用时,以及通过分配给输入字段导致输入行重建时。
=="key5" && !=5
匹配key部分为key5
,value部分为not5
的行
- 将
10
分配给 </code> - 第二个输入字段 - 然后导致输入行 <em> 重建</em>,导致 <code>key5=10
{ print }
简单地打印每个(可能修改过的)输入行。
sed:如果该行以 key5=
开头,并且 而不是 以 =5
结尾,则替换值
sed '/^key5=/ {/=5$/! s/=.*/=10/}' <<END
key1=1
key2=2
key5=5
key5=6
END
key1=1
key2=2
key5=5
key5=10
有一个包含键值的配置文件
key1=1
key2=2
key5=6
想把key5不是5的值替换为10
awk '
BEGIN{FLAG=0}
/key5=6/{FLAG=1}
END { if (FLAG == 0) {sed -i "s/^key5.*/key5=10/1"
print "key5 is now 10" } }' test.config
代码在不同的行上。另外,忽略开始和结束双引号。使用此编辑器无法正确完成。 sed 命令不起作用,我是否正确转义了它? sed 本身在命令行上运行良好
此答案假定您的配置文件的键值对实际上每个都在单独的一行上,这正是您的 awk
命令所建议的。
看起来您正试图在 程序中直接从 调用 sed
,这不会起作用 - 唯一的方法从 awk
调用其他实用程序是使用 system()
函数或管道 ("<cmd>" | getline ...
)。
但是,这很少是正确的方法;相反,使用 awk
修改输入字段的能力:
awk 'BEGIN{ FS=OFS="=" } =="key5" && !=5 { = 10 } { print }' test.config
BEGIN{ FS=OFS="=" }
告诉awk
按=
(FS
) 将每个输入行拆分为多个字段,并用=
(=
(OFS
)。OFS
适用于将print
与多个参数一起使用时,以及通过分配给输入字段导致输入行重建时。
=="key5" && !=5
匹配key部分为key5
,value部分为not5
的行- 将
10
分配给</code> - 第二个输入字段 - 然后导致输入行 <em> 重建</em>,导致 <code>key5=10
- 将
{ print }
简单地打印每个(可能修改过的)输入行。
sed:如果该行以 key5=
开头,并且 而不是 以 =5
结尾,则替换值
sed '/^key5=/ {/=5$/! s/=.*/=10/}' <<END
key1=1
key2=2
key5=5
key5=6
END
key1=1
key2=2
key5=5
key5=10