在linux中用sed在指定字符串后追加内容,核心是s///配合捕获组(…)与反向引用\1(或&),支持行内插入、行尾追加、全局替换及大小写忽略;特殊字符需转义,复杂场景建议awk或perl。

在 Linux 中,用 sed 在指定字符串后面追加内容,核心是用 s/// 命令配合捕获组(\(…\))和反向引用(\1),把原字符串“保留+拼接新内容”。
基础语法:匹配后追加(同一行)
想在某行中第一次出现的 target 后面加 newtext,用:
sed 's/target/targetnewtext/' file
更通用、安全的写法(避免重复拼接):
sed 's/\(target\)/\1newtext/' file
其中 \(target\) 捕获原字符串,\1 表示它本身,再紧接 newtext,确保只在匹配处插入。
- 加
-i参数直接修改文件:sed -i 's/\(port:\)/\1 8080/' config.txt - 用
&可简化(&代表整个匹配项):sed 's/target/&newtext/',等价于上面的\1写法 - 若目标字符串含特殊字符(如
/、.、*),需转义:sed 's/\(\/path\)/&_backup/'
追加到匹配行的末尾(而非字符串后)
如果需求是“找到含某个字符串的行,在该行末尾追加”,不是插在字符串中间,用:
sed '/pattern/s/$/append_text/' file
例如:给所有含 error 的行末尾加 #handled
sed '/error/s/$/ #handled/' log.txt
-
/pattern/定位行,s/$/.../表示在行尾($)替换为空并插入内容 - 支持正则 pattern,比如
/^WARN/匹配以 WARN 开头的行
全局替换 & 多次匹配处理
默认 sed 只替换每行第一个匹配。要追加到所有出现位置,加 g 标志:
sed 's/\(key:\)/\1 value/g' data.conf
这会在每行中所有 key: 后都追加 value。
- 组合使用
i(忽略大小写):sed 's/\(port\)/\1_8080/gi' - 若要跨行匹配或更复杂逻辑,
sed能力有限,建议改用awk或perl
实际例子:修改配置文件
假设 nginx.conf 中有:
listen 80;
想在 listen 后面加 ssl http2,变成 listen 80 ssl http2;:
sed -i 's/\(listen[[:space:]]\+[0-9]\+\;\)/\1 ssl http2/' nginx.conf
说明:
-
[[:space:]]\+匹配一个或多个空白字符 -
[0-9]\+匹配端口号 -
\;匹配字面分号(需转义) - 整个匹配被保留(
\1),再追加新内容











