Bash 一个衬垫来更改配置参数

Bash 一个衬垫来更改配置参数

我有一个具有以下结构的配置文件。

ValueOne = 1
ValueTwo = 2
ValueThree = 3

我想要一个单行 bash 脚本来找到 ValueTwo 并将其值更改为 22222。

任何想法? 不是学校的事情

答案1

我打赌会有更好的,但这是我的做法:

如果配置文件在其自己的行上有参数

sed -i '/ValueTwo/s/= .*/= 22222/' config_file
  • /ValueTwo/:搜索字符串ValueTwo以找到要操作的行(地址
  • s/= .*/= 22222/:在与上面搜索匹配的行上,替换= .*= 22222(代替
  • = .*:搜索=字符后跟一个空格 ( ) 字符,后跟 0 个或多个任意字符 ( .*) (正则表达式示例
  • = 22222:将找到的内容替换为文字字符串= 22222

这将就地替换 config_file 的内容。要创建更改参数的新文件,请删除-i并放置> new_file在该行的末尾。


如果您的配置文件在同一行上有参数(如未编辑的问题):

sed -i 's/ValueTwo = [^ ]*/ValueTwo = 22222/' config_file

这也将就地替换 config_file 的内容。只要 ValueTwo 的参数中没有空格,它就可以工作。这也适用于参数位于其自己的行上的情况,但在这种情况下前一种方法可能更稳健。

答案2

perl -p -i.bak -e 's/ValueTwo = 2/ValueTwo = 22222/' path/to/configfile

将就地编辑文件并保存原始文件的副本,以防手指出现问题。您可以使用 awk 执行相同的操作。

答案3

我会选择awk

awk '/ValueTwo/{$3=22222}1;' file > newfile

上面的代码检查给定的行是否与 ValueTwo 匹配,并将 3d 字段设置为222匹配的行。这1;只是 awk shgorthand 的书写方式print $0,它会打印每一行。由于它位于匹配块 ( /ValueTwo/{}) 之外,因此将导致打印所有行。

既然你要求一个 bash 解决方案(不知道为什么你会更喜欢一个,但仍然),你可以尝试这个:

while read key eq val; do
    [ $key = "ValueTwo" ] && val=22222
    printf "%s %s %s\n" $key $eq $val
done <  file

答案4

使用ex编辑器(Vi 的一部分):

ex +'%s/^ValueTwo[^=]\?=[^0-9]\?\zs[^$]\+/22222/' -scwq config.ini

解释:

  • +cmd- 执行 ex/viC命令;
  • %s/foo/bar/-s查找和替换语法;
  • ^- 行的开头;
  • [^=]\?=[^0-9]\?- 选择等号 ( =) 周围的区域;
  • \zs[^$]- 选择要替换的零件直到行尾;
  • /22222/- 替换为的模式( 后面的所有内容\zs);
  • -s-s静音模式;
  • -c<command>- 执行<command>
  • -cwq- 执行w仪式和q伊特;

相关内容