动态更新配置文件中的值
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
警告:当键或值有斜杠时,这两个答案都会出现问题。
我有一个管道分隔的配置文件,看起来像
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
警告:当键或值有斜杠时,这两个答案都会出现问题。