Day 3:sed 流编辑
·
2 分钟阅读
linux学习路线sed流编辑
Day 3:sed 流编辑
今日目标:用 sed 做替换、删除行、提取行——不改文件时预览,确认无误后直接修改 🎯
命令速览
| 操作 | 语法 | 用途 |
|---|
| 替换 | sed 's/old/new/g' | 全局替换 |
| 就地修改 | sed -i 's/old/new/g' | 直接修改文件(危险但常用) |
| 删除行 | sed '3,5d' | 删除第 3~5 行 |
| 打印行 | sed -n '10p' | 只打印第 10 行 |
| 行范围操作 | sed '/start/,/end/d' | 删除从 start 到 end 的行块 |
逐个击破
① 替换 — s/old/new/g
- 语法:
sed 's/查找/替换/标志' <FILE> - 标志:
g→全局替换(每行所有匹配),不加 g 只替换每行第一个匹配 - 🖥️ 上手练(先准备数据):
cat > /tmp/sed-test.txt <<EOF
hello world
hello linux
hello world hello again
goodbye world
EOF
sed 's/hello/hi/' /tmp/sed-test.txt——只替换每行第一个 hellosed 's/hello/hi/g' /tmp/sed-test.txt——全局替换所有 hellosed 's/world/earth/' /tmp/sed-test.txt——替换 worldsed 's/hello/hi/g; s/world/earth/g' /tmp/sed-test.txt——同时做多个替换(分号分隔)
- ⚠️ 常见坑:sed 默认输出到终端,不会修改文件,加
-i 才直接修改
② 就地修改 — sed -i
- 语法:
sed -i 's/old/new/g' <FILE> - 🖥️ 上手练:
cp /tmp/sed-test.txt /tmp/sed-test.bak——先备份sed -i 's/hello/hi/g' /tmp/sed-test.txt && cat /tmp/sed-test.txt——直接修改了- 恢复:
cp /tmp/sed-test.bak /tmp/sed-test.txt sed -i.bak 's/hello/hi/' /tmp/sed-test.txt——-i.bak 生成 .bak 备份文件
- ⚠️ 致命坑:
sed -i 不可逆!没有 git 时先备份
③ 按行删除 — d
- 语法:
sed '<N或RANGE>d' <FILE> - 🖥️ 上手练(创建测试数据):
seq 1 10 > /tmp/sed-num.txt
sed '3d' /tmp/sed-num.txt——删除第 3 行sed '3,5d' /tmp/sed-num.txt——删除第 3~5 行sed '1d' /tmp/sed-num.txt——删除第 1 行sed '/^5/,/^8/d' /tmp/sed-num.txt——删除从 “5” 开头到 “8” 开头的行块sed '/^#/d' /etc/ssh/sshd_config——删除所有注释行
④ 打印指定行 — p
- 语法:
sed -n '<N>p' <FILE>(-n 抑制默认输出,配合 p 只打印指定行) - 🖥️ 上手练:
sed -n '1p' /tmp/sed-num.txt——打印第 1 行sed -n '5,8p' /tmp/sed-num.txt——打印第 5~8 行sed -n '$p' /tmp/sed-num.txt——打印最后一行($ 在 sed 中表示最后一行)
⑤ 行范围操作
- 🖥️ 上手练:
sed -n '/^2/,/^6/p' /tmp/sed-num.txt——打印从 “2” 开头到 “6” 开头的行范围sed '/^3/,/^7/s/.*/REPLACED/' /tmp/sed-num.txt——在 3~7 行范围内做替换- 实战:删除 C 风格注释块
/* ... */(略)
💪 今日必刷(全部终端实操)
- 将
/etc/ssh/sshd_config 中所有 yes 替换为 no(先不要用 -i,只输出看效果) - 用 sed 删除
/etc/ssh/sshd_config 的所有注释行和空行,输出有效配置(管道也行) - 打印
/etc/passwd 的第 1 行和第 10 行(用 sed 实现,不用 head+tail) - 用 sed 批量替换——将
/tmp/sed-test.txt 中 hello 改为 hi、world 改为 earth(一条命令) - 实际修改:用
sed -i 将 /tmp/sed-num.txt 中的奇数行注释掉(每行前加 #) - 排错题:执行
sed -i 's/a/b/' file 报 invalid command code——可能原因是什么?如何排查? - 排错题:执行
sed 's/\//-/g' /tmp/path.txt 发现把所有 / 都替换了,但你只想替换行首的 /——如何限制替换范围?
📚 命令详解
本文采用 CC BY-NC-SA 4.0
更多链接