我有一个具有以下结构的配置文件。
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伊特;