Shell脚本实现含values键指定行的元素增删操作
如何用Shell脚本修改test.txt中的values列表?
这问题我之前处理过,用sed命令就能轻松搞定,分两步给你说清楚:
1. 向values列表添加新元素
要给test.txt里那行values = ...的末尾追加新元素,直接用sed定位目标行然后追加就行。比如要添加ghf,执行下面的命令:
sed -i '/^values = / s/$/, ghf/' test.txt
简单解释:
/^values = /专门匹配以values =开头的行,防止误改其他内容s/$/, ghf/把匹配行的末尾替换成, ghf,相当于在最后加上新元素
注意:如果你用的是macOS,sed的-i参数需要加个空后缀(避免自动生成备份文件),命令改成这样:
sed -i '' '/^values = / s/$/, ghf/' test.txt
2. 从values列表移除指定元素
移除元素要考虑它在列表里的位置——是开头、中间还是结尾?用带扩展正则的sed命令能覆盖所有情况。比如要移除ert,执行:
sed -i -r '/^values = / s/(^|, )ert(, |$)/\1\2/; s/,,/,/; s/^values = , /values = /; s/ values = $/values = /' test.txt
详细说明:
-r启用扩展正则,不用写一堆转义符,写起来更清爽(^|, )ert(, |$)精准匹配三种场景:ert在列表开头(前面是行首,后面跟着,)ert在列表中间(前后都是,)ert在列表结尾(前面是,,后面是行尾)
\1\2保留前后的分隔符,避免出现多余的逗号- 后面的几个替换是处理边界问题:比如移除元素后出现连续逗号
,,,或者开头/结尾只剩逗号,这些都会被自动清理掉
同样,macOS的sed要调整参数,用-E代替-r,并且-i加空后缀:
sed -i '' -E '/^values = / s/(^|, )ert(, |$)/\1\2/; s/,,/,/; s/^values = , /values = /; s/ values = $/values = /' test.txt
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

