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