sed(Stream Editor)是 Linux/Unix 系统中一个强大的文本处理工具,支持正则表达式,可以对输入流(文件或管道)进行非交互式的编辑操作。
1. sed 基本语法
sed [选项] '命令' 输入文件
sed [选项] -f 脚本文件 输入文件
2. sed 常用选项(参数)
| 选项 | 说明 |
|---|---|
-n |
禁止默认输出(仅打印受影响的文本) |
-i |
直接修改文件(-i.bak可备份原文件) |
-e |
指定多个编辑命令(sed -e 'cmd1' -e 'cmd2') |
-f |
从脚本文件读取 sed命令 |
-E或 -r |
启用扩展正则表达式(ERE) |
-l |
指定行长度(很少用) |
--debug |
调试模式(GNU sed支持) |
3. sed 基本命令
(1)行选择
| 命令 | 说明 |
|---|---|
n |
读取下一行(跳过当前行) |
p |
打印当前行(通常与 -n一起使用) |
d |
删除当前行 |
q |
退出 sed(处理到指定行后停止) |
示例:
sed '1d' file.txt # 删除第1行
sed '1,5d' file.txt # 删除1-5行
sed '/pattern/d' file.txt # 删除匹配 "pattern" 的行
sed -n '1,5p' file.txt # 仅打印1-5行
sed '5q' file.txt # 处理到第5行后退出
(2)文本替换(s 命令)
| 命令 | 说明 |
|---|---|
s/old/new/ |
替换每行第一个匹配的 old为 new |
s/old/new/g |
替换所有匹配的 old为 new |
s/old/new/2 |
替换每行第2个匹配的 old |
s/old/new/i |
忽略大小写替换 |
s/old/new/p |
打印替换成功的行(通常与 -n一起使用) |
示例:
sed 's/foo/bar/' file.txt # 替换每行第一个 "foo" 为 "bar"
sed 's/foo/bar/g' file.txt # 全局替换
sed 's/foo/bar/2' file.txt # 替换每行第2个 "foo"
sed 's/foo/bar/i' file.txt # 忽略大小写替换
sed -n 's/foo/bar/p' file.txt # 仅打印替换成功的行
(3)行编辑
| 命令 | 说明 |
|---|---|
a\text |
在当前行后追加 text |
i\text |
在当前行前插入 text |
c\text |
替换当前行(整行替换) |
r file |
读取文件内容并插入到当前行后 |
w file |
将匹配的行写入文件 |
示例:
sed '2a\Hello' file.txt # 在第2行后追加 "Hello"
sed '3i\World' file.txt # 在第3行前插入 "World"
sed '/foo/c\New Line' file.txt # 替换包含 "foo" 的行为 "New Line"
sed '/foo/r data.txt' file.txt # 在匹配 "foo" 的行后插入 data.txt 的内容
sed -n '/foo/w output.txt' file.txt # 将匹配 "foo" 的行写入 output.txt
(4)多行操作
| 命令 | 说明 |
|---|---|
N |
读取下一行并合并到当前行(多行模式) |
P |
打印多行模式的第一行 |
D |
删除多行模式的第一行 |
示例:
sed 'N;s/\n/ /' file.txt # 合并两行为一行(用空格分隔)
(5)分支和标签
| 命令 | 说明 |
|---|---|
b label |
跳转到标签 label |
t label |
如果替换成功,跳转到 label |
:label |
定义标签 label |
示例:
sed '/foo/{ s/foo/bar/; b end; }; :end' file.txt # 匹配 "foo" 后替换并跳转
4. sed 高级用法
(1)正则表达式
| 表达式 | 说明 |
|---|---|
^ |
匹配行首 |
$ |
匹配行尾 |
. |
匹配任意字符 |
* |
匹配前一个字符0次或多次 |
\+ |
匹配前一个字符1次或多次(-E启用) |
\? |
匹配前一个字符0次或1次(-E启用) |
[abc] |
匹配 a、b或 c |
[^abc] |
匹配非 a、b、c的字符 |
\(...\) |
分组捕获(\1引用) |
示例:
sed -E 's/(foo)(bar)/\2\1/' file.txt # 交换 "foo" 和 "bar"
(2)变量和引用
var="hello"
sed "s/foo/$var/" file.txt # 使用 Shell 变量
5. 常见 sed 示例
(1)删除空行
sed '/^$/d' file.txt
(2)删除行首/行尾空格
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt
(3)在行首/行尾添加内容
sed 's/^/HEADER /' file.txt # 每行开头加 "HEADER"
sed 's/$/ TAIL/' file.txt # 每行结尾加 "TAIL"
(4)仅处理匹配的行
sed '/pattern/{s/foo/bar/;s/baz/qux/}' file.txt
6. 总结
sed主要用于 文本替换、删除、插入、打印 等操作。- 常用命令:
s(替换)、d(删除)、p(打印)、a/i/c(插入/追加/替换行)。 - 结合正则表达式可以处理复杂的文本操作。
-i直接修改文件,-n禁止默认输出。
掌握 sed 可以极大提高 Linux 下的文本处理效率!🚀
评论区