如何用sed注释配置文件指定行并添加新行?批量处理及命令验证
解决你的配置文件批量修改问题
先拆解下你遇到的问题,逐个说清楚:
第一条sed命令的问题
你写的 sed -ri 's/params:/^\\*' File1.conf 存在两个关键错误:
- sed的
s替换命令必须遵循s/匹配模式/替换内容/[选项]的格式,你的命令缺少结尾的分隔符,语法本身就不成立; - 就算补上分隔符,
^\\*的写法也不符合需求——如果是想给匹配行添加注释(配置文件里更常用#作为注释符),应该用# &(&代表匹配到的整个内容),而你写的^会被当作普通字符输出,\\*的转义方式也不对。
如果要把以params: 开头的行用#注释掉,正确的命令是:
sed -ri 's/^params:/# &/' File1.conf
要是你的配置文件确实用*做注释符,那修正后的命令是:
sed -ri 's/^params:/\* &/' File1.conf
这里的\*是转义星号,避免被sed当作正则元字符处理。
第二条sed命令的问题
你写的 sed -ri '/params:/params: changed according to my will' File1.conf 语法错误——/params:/是匹配地址,后面需要跟sed的具体命令(比如a表示追加行),正确写法应该是:
sed -ri '/^params:/a params: changed according to my will' File1.conf
a命令会在匹配到的行后面追加指定内容。
合并操作的正确sed命令
我们可以把「注释原行」和「追加新行」合并成一条命令,用-e选项或者分号分隔多个操作:
sed -ri -e 's/^params:/# &/' -e '/^params:/a params: changed according to my will' File1.conf
或者更简洁的分号写法:
sed -ri 's/^params:/# &/; /^params:/a params: changed according to my will' File1.conf
这样就能一次性完成两个需求。
批量处理4个文件的方法
有两种简单的方式批量处理File1到File4:
方法1:for循环遍历文件
利用shell的 brace 展开特性自动生成文件名列表:
for file in File{1..4}.conf; do sed -ri -e 's/^params:/# &/' -e '/^params:/a params: changed according to my will' "$file" done
File{1..4}.conf会自动展开为File1.conf File2.conf File3.conf File4.conf,遍历每个文件执行修改。
方法2:直接传递所有文件给sed
sed本身支持同时处理多个文件,直接列出所有文件名即可:
sed -ri -e 's/^params:/# &/' -e '/^params:/a params: changed according to my will' File1.conf File2.conf File3.conf File4.conf
如果文件名有规律,也可以用通配符简化(比如所有文件都是File*.conf):
sed -ri -e 's/^params:/# &/' -e '/^params:/a params: changed according to my will' File*.conf
注意事项
- 如果你用的是BSD sed(比如macOS系统自带的),
-i选项需要加空参数-i '',因为BSD sed要求指定备份文件后缀,空参数表示不创建备份:sed -i '' -e 's/^params:/# &/' -e '/^params:/a params: changed according to my will' File*.conf - 测试时可以先去掉
-i选项,查看输出是否符合预期,确认没问题再修改原文件。
内容的提问来源于stack exchange,提问作者Luk
相关产品推荐
相关产品推荐

