动态更新配置文件中的值

update value in config file dynamically

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

  Value1|1
  Value2|2
  Value3|3

我正在使用 grep 命令从配置文件和预期的 returns 2 中获取我想要的行。

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

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

  Value2|2

  Value2|4

以下适用于 Linux GNU sed 版本 4.1.5

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

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

的副本

其余语法:

/^value2|/ = 仅适用于匹配此正则表达式的行,^ 表示行的开头,而 | 是文字,这样你就不会匹配类似的东西,例如 Value22|22.

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

^\(..*\)| 将匹配行首到 | 符号的一个或多个字符,.*$ 将匹配 | 之后的零个或多个字符符号到行尾。 $代表行尾。这应该匹配整行。

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


更新20170314

如果您没有带 -i 选项的 GNU sed,您可以尝试这样的操作:

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

从下一个变量集开始(或使用 read -p "Key please:" key 获取它们)

key="Value2"
newvalue="4"

使用 gnu sed 你可以做到

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

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

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

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