sed 常用替换与行处理速查
常用命令
sed 's/old/new/' file
sed 's/old/new/g' file
sed -i 's/old/new/g' file
sed -i.bak 's/old/new/g' file
sed -n '10,20p' file
sed -n '/start/,/end/p' file
sed '/pattern/d' file
sed '1d;$d' file
sed '3i\inserted line' file
sed '3a\appended line' file
sed 's/^/prefix /' file
sed 's/$/ suffix/' file
sed -E 's/([0-9]+)/[\1]/g' file
地址与命令
| 写法 |
含义 |
10p |
第 10 行 |
10,20p |
第 10–20 行 |
/regex/p |
匹配行 |
/start/,/end/p |
范围 |
$ |
最后一行 |
! |
取反 |
s/// |
替换 |
d |
删除 |
p |
打印(常配 -n) |
i\ / a\ |
前插/后插 |
c\ |
替换整行 |
场景速查
| 目的 |
写法 |
| 只替换第 N 次 |
sed 's/old/new/2' |
| 保留备份 |
sed -i.bak 's/old/new/g' |
| 删除空行 |
sed '/^$/d' |
| 删除注释 |
sed '/^#/d' |
| 取两个标记之间 |
sed -n '/BEGIN/,/END/p' |
| 多文件批量替换 |
find . -name '*.conf' -exec sed -i 's/old/new/g' {} + |
易错点
-i 会直接改文件;先用不带 -i 的命令预览。
- macOS 的
sed -i 需要后缀,sed -i '' 才是就地修改;Linux 不同。
- 基本正则和扩展正则不同;需要
-E 时显式加。
- 替换字符串里的
& 表示整个匹配;需要字面量时转义 \&。
- 斜杠冲突可换分隔符:
s#old#new#g。
- 大文件逐行处理很快,但复杂逻辑优先 awk/perl。
相关命令
awk — 字段处理
grep — 搜索
perl -pi -e — 更复杂的批量替换