动态更新配置文件中的值

时间:2017-03-10 20:13:04

标签: unix ksh

我有一个管道分隔的配置文件,看起来像

  Value1|1
  Value2|2
  Value3|3

我正在使用grep命令从配置文件中获取我想要的行,并按预期返回2。

  grep 'Value2' config.ctl>config_tmp.ctl
  val=$(cut -f2,2 -d"|" config_tmp.ctl)

我要做的是根据第一列更新第二列

  Value2|2

  Value2|4

2 个答案:

答案 0 :(得分:1)

以下适用于使用GNU sed版本4.1.5的Linux

sed -i '/^Value2|/s/^\(..*\)|.*$/\1|4/' config.ctl

-i告诉sed直接编辑该文件。您可以添加后缀,它将使用该后缀创建原始备份,例如:-i.bak将创建一个名为config.ctl.bak的副本。

语法的其余部分:

/^value2|/ =仅适用于与此正则表达式匹配的行,^表示该行的开头,|是文字,这样您就不匹配类似的事情,例如Value22|22

该行的其余部分仅对与Value2匹配的那些行进行替换,\(\)对允许您替换替换上的匹配值。

^\(..*\)|会将该行开头的一个或多个字符与|符号匹配,.*$将匹配|符号后的零个或多个字符行的结尾。 $表示该行的结尾。这应该匹配整行。

替换部分/\1|4/然后用括号内匹配的内容替换该行,后跟|符号后跟数字4。

更新20170314

如果你没有带-i选项的GNU sed,你可以尝试这样的事情:

cp config.ctl config_tmp.ctl
sed '/^Value2|/s/^\(..*\)|.*$/\1|4/' config_tmp.ctl > config.ctl

答案 1 :(得分:1)

从下一个变量集开始(或者使用read -p "Key please:" key

key="Value2"
newvalue="4"

使用gnu sed,您可以

sed -i 's/\('"${key}"'|\).*/\1'"${newvalue}"'/' config.ctl

如果没有-i选项,您应该将其重定向到tmp文件,并在sed成功后移动它。
这比这里的文件中的vi更容易 另一种选择是好的ed

ed -s config.ctl << EOF
1,$ s/^${key}|.*/${key}|${value}/
w
q
EOF

警告:当键或值有斜杠时,两个答案都会出现问题。