Linux 中 sed 命令

给大家拓展一个知识点。

下面是对 Linux 中 sed 命令 的全面整理,涵盖其常用语法、功能和高级用法,非常适合查阅和实践。


🧠 什么是 sed

sed(Stream Editor) 是 Linux 中的强大文本处理工具,用于按照指定的规则对文件或文本流进行替换、删除、插入、打印等操作,无需打开文件即可批量修改内容


🔰 基本语法

bash 复制代码
sed [选项] '命令' 文件名

或配合管道:

bash 复制代码
cat file.txt | sed '命令'

🛠️ 常用命令大全

类型 命令 & 示例 说明
替换 sed 's/foo/bar/' file 将首个 foo 替换为 bar(每行)
替换全部 sed 's/foo/bar/g' file 将所有 foo 替换为 bar(全行)
删除行 sed '2d' file 删除第 2 行
删除多行 sed '2,5d' file 删除第 2 到 5 行
删除匹配 sed '/pattern/d' file 删除包含 pattern 的所有行
打印行 sed -n '2p' file 打印第 2 行(-n 阻止默认输出)
多行打印 sed -n '2,5p' file 打印第 2 到 5 行
匹配打印 sed -n '/pattern/p' file 打印匹配 pattern 的行
插入前行 sed '2i\Hello' file 在第 2 行前插入 "Hello"
插入后行 sed '2a\World' file 在第 2 行后插入 "World"
替换整行 sed '3c\New line content' file 替换第 3 行为指定内容
多命令 sed -e '1d' -e 's/foo/bar/g' file 多个 sed 命令一起执行
备份替换 sed -i.bak 's/old/new/g' file 修改文件并备份原文件
原地替换 sed -i 's/old/new/g' file 直接修改原文件内容
正则模式 sed -n '/^[a-z]\{3,\}/p' file 打印 3 个以上小写字母开头的行

🎯 替换高级技巧

✅ 替换第 N 次匹配:

bash 复制代码
sed 's/foo/bar/2' file     # 仅替换每行第 2 个 foo

✅ 替换某一行:

bash 复制代码
sed '5s/abc/ABC/' file     # 只在第 5 行替换 abc → ABC

✅ 替换范围内的内容:

bash 复制代码
sed '2,4s/foo/bar/g' file  # 只在第 2-4 行中替换 foo → bar

🔄 插入 & 删除操作

操作 命令
插入前 sed '3i\This is inserted'
插入后 sed '3a\This is inserted'
替换行 sed '3c\Replaced line'
删除行 sed '3d'
删除匹配 sed '/pattern/d'

💡 实用场景示例

✅ 批量替换文件中的字符串(并保存修改)

bash 复制代码
sed -i 's/localhost/127.0.0.1/g' config.txt

✅ 删除空行:

bash 复制代码
sed '/^$/d' file.txt

✅ 删除开头是 # 的注释行:

bash 复制代码
sed '/^#/d' file.txt

✅ 提取某个字段(例如冒号后字段):

bash 复制代码
sed 's/.*: //' file.txt

🧪 与正则表达式结合(增强匹配能力)

正则模式 含义
^ 匹配行首
$ 匹配行尾
. 匹配任意一个字符
* 匹配前一个字符 0 次或多次
\{n,m\} 匹配前一个字符 n 到 m 次
[] 字符集,如 [a-z]
\( \) 分组匹配,用于后向引用
\1, \2 引用前面的分组

示例:

bash 复制代码
sed -n 's/ID: \([0-9]\+\)/\1/p' file.txt

提取形如 ID: 12345 的数字部分


🆚 与 awk 的区别

特性 sed awk
核心用途 文本流编辑器(替换/插入/删除) 数据分析与格式化(按列处理)
使用场景 修改内容为主 分列、聚合、数学操作为主
可读性 简洁但略难读 结构清晰,可像脚本一样编写

✅ 小结

类别 命令关键字 说明
替换 s/old/new/ 替换 old 为 new
删除 d 删除指定行或匹配行
打印 p 显示指定行或匹配行
插入 i, a 在某行前后插入内容
替换整行 c 替换整行为新内容