如何为文件中两个指定模式标记之间的每行开头添加#注释
两个固定标记行之间的行批量添加#前缀解决方案
你原来的写法只会输出两个标记之间的内容,其他行都被丢弃,因此无法直接合并回原文件,你可以用以下两种成熟方案实现需求:
方案1:sed 命令(更简洁,支持就地修改)
GNU Sed(Linux 默认环境)
直接使用-i参数实现原地修改:
sed -i '/^################## PATTERN #1/,/^################## PATTERN #2/{ /^#*PATTERN #/!s/^/#/ }' myinputfile
macOS 自带 Sed
-i参数需要额外加空后缀声明:
sed -i '' '/^################## PATTERN #1/,/^################## PATTERN #2/{ /^#*PATTERN #/!s/^/#/ }' myinputfile
命令逻辑说明:
- 两个
/模式/用逗号分隔,表示匹配两个标记行之间的所有行 - 大括号内的逻辑:先排除两个标记行本身(匹配到带
PATTERN #的行不处理),其余行在行首插入#
方案2:awk 命令(跨平台兼容性更强)
直接用 awk 处理全量行,输出到临时文件后替换原文件,适合所有类Unix系统:
awk ' /################## PATTERN #1/{flag=1; print; next} /################## PATTERN #2/{flag=0; print; next} flag {print "#"$0; next} 1 ' myinputfile > tmp_file && mv tmp_file myinputfile
命令逻辑说明:
- 匹配到第一个标记行时,启用修改标记
flag=1,直接打印原标记行后跳过后续逻辑 - 匹配到第二个标记行时,关闭修改标记
flag=0,直接打印原标记行后跳过后续逻辑 - 当
flag=1时,在行首加#后打印 - 末尾的
1是awk固定写法,表示所有未被前面逻辑匹配的行,原样打印 - 最后用
&&操作符确保awk处理成功后,才用临时文件替换原文件,避免文件损坏
内容的提问来源于stack exchange,提问作者j4ckpug
相关产品推荐
相关产品推荐

