我有一个文件 test.txt,其中包含如下行
values = abc, def, dfg, ert, sdf, sfd, sdf
我使用 shell 脚本在 test,txt 中的值中添加一个以逗号分隔的新值。
例如,我需要添加test.txt 中的“ghf”:
values = abc, def, dfg, ert, sdf, sfd, sdf, ghf
我还需要删除该值。
例如,如果我需要消除test.txt 中的“ert”:
values = abc, def, dfg, sdf, sfd, sdf, ghf
我怎样才能在shell脚本中实现这一点?
(IE)
如果我给
echo "abc" >> test.txt
它能够将“abc”附加到文件末尾,但我需要附加到 test.txt 中的“values=”字段
谢谢,
哈里
答案1
快速解决方案,无需防范极端情况。
(谢谢格伦·杰克曼用于sed
优化。)
添加
sed -i "/^values = / s/$/, ${NEW_VALUE}/" test.txt
解释
sed -i
- 在给定文件中进行更改,不打印到stdout
.
/^values = /
- 当sed
位于以 开头的行上时values =
。
s/$/, ${NEW_VALUE}/
- 附加, ${NEW_VALUE}
在行尾。
test.txt
sed
-将对其执行操作的文件。
去除
sed -i "/^values = / s/ ${REMOVE_VALUE},\?//" test.txt
解释
s/ ${REMOVE_VALUE},\?//
- 删除第一次出现的${REMOVE_VALUE}
以及可选的后续,
。
此解决方案存在的问题
- 添加第一个值将
,
立即添加values =
- 删除最后一个值将留下以 结尾的行
,
。 - 如果添加/删除的变量包含命令
sed
的分隔符s
(在我的示例中是/
),则命令将不起作用。
答案2
使用ed
您可以执行以下操作:
ed -s test.txt <<<$'/values/s/$/,ghf\nw' # add ghf to the end of line
和
ed -s values <<<$'/values/s/ert,//\nw' # remove ert