sed 可用 i\ 命令在匹配行前插入固定注释,如 sed '/password/i\# warning: contains password';动态注释需 shell 变量辅助或改用 awk 实现,如 awk '/password/ { print "# found in line " nr ": " $0 } { print }'。

用 sed 在匹配行前面插入一行注释(比如 # ),关键是用 i\ 命令(insert),但要注意:它只能在**匹配到的行之前**插入**固定内容**;若需“动态”生成注释(例如包含匹配内容、行号、时间等),纯 sed 较难实现,推荐结合 shell 变量或改用 awk。不过基础场景下,sed 完全可以胜任。
直接在匹配行前插入固定注释
例如,在所有含 password 的行前面加 # WARNING: contains password:
sed '/password/i\# WARNING: contains password' file.txt
注意:i\ 后必须紧贴换行或反斜杠后接内容,且不能有空格;多行插入需重复写 i\。
插入含匹配文本的动态注释(需 shell 变量辅助)
sed 本身不支持把捕获组回填到 i\ 行中,但可以用 shell 变量“绕行”:先提取匹配内容,再拼接插入。例如为每行匹配的关键词生成专属注释:
- 用
grep -n找出行号和内容,再用sed按行号插入 - 更实用的是用
awk一步完成(推荐):
awk '/password/ { print "# FOUND in line " NR ": " $0 } { print }' file.txt
这会在匹配行前输出带行号和原内容的注释,再输出原行 —— 效果等价于“动态前置注释”。
用 sed + 地址范围配合 i 实现条件插入
如果只想对第 1 个 user: 前插入注释,可用地址限定:
sed '0,/user:/i\# FIRST USER BLOCK STARTS HERE' config.yml
其中 0,/pattern/ 表示从开头到第一个匹配行为范围,i\ 插入仅发生一次。
避免常见错误
-
i\后不能跟空格,写成i\ # comment会报错;正确是i\# comment或换行写 - macOS 的 sed(BSD 版)要求
i\后必须换行,GNU sed 允许i\text写在同一行;跨平台建议换行写法 - 若文件要就地修改,加
-i参数(macOS 需-i '')











