# 基本替换语法:s/原字符串/新字符串/标志 sed 's/old/new/'file.txt # 只替换每行第一次出现 sed 's/old/new/g'file.txt # 全局替换(所有出现) sed 's/old/new/i'file.txt # 忽略大小写替换 sed 's/old/new/p'file.txt # 替换并打印匹配行 sed 's/old/new/gp'file.txt # 全局替换并打印匹配行 sed 's/old/new/2'file.txt # 替换每行第2次出现 sed 's/old/new/gw output.txt'file.txt # 替换结果写入指定文件
# 使用不同分隔符(避免转义斜杠) sed 's|/old/path|/new/path|'file.txt sed 's_old_new_'file.txt sed 's#http://#https://#'file.txt
2. 删除命令 (d)
1 2 3 4 5 6 7 8 9 10 11 12 13
# 删除指定行 sed '3d'file.txt # 删除第3行 sed '3,5d'file.txt # 删除第3到第5行 sed '3,$d'file.txt # 删除第3行到文件末尾 sed '1~2d'file.txt # 删除奇数行 sed '2~2d'file.txt # 删除偶数行
# 删除匹配模式的行 sed '/pattern/d'file.txt # 删除包含pattern的行 sed '/^$/d'file.txt # 删除空行 sed '/^[[:space:]]*$/d'file.txt # 删除空白行 sed '/^#/d'file.txt # 删除注释行
3. 打印命令 §
1 2 3 4 5 6 7
# 需要配合-n选项使用 sed -n '3p'file.txt # 打印第3行 sed -n '3,5p'file.txt # 打印第3到第5行 sed -n '/pattern/p'file.txt # 打印包含pattern的行 sed -n '1~2p'file.txt # 打印奇数行 sed -n '2~2p'file.txt # 打印偶数行
4. 插入命令 (i, a, c)
1 2 3 4 5 6 7 8 9 10 11 12
# 插入命令 sed '3i\新行内容'file.txt # 在第3行前插入 sed '/pattern/i\新行内容'file.txt # 在匹配行前插入
# 追加命令 sed '3a\新行内容'file.txt # 在第3行后追加 sed '/pattern/a\新行内容'file.txt # 在匹配行后追加
# 替换命令 sed '3c\新行内容'file.txt # 替换第3行 sed '/pattern/c\新行内容'file.txt # 替换匹配行
5. 其他常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 行号显示 (=) sed '='file.txt # 显示所有行号 sed '/pattern/='file.txt # 显示匹配行的行号
# 列出行内容 (l) sed -n 'l'file.txt # 显示所有行(转义特殊字符) sed -n '/pattern/l'file.txt # 显示匹配行(转义特殊字符)
# 读取文件 (r) sed '/pattern/r insert.txt'file.txt # 在匹配行后读入文件内容
# 写入文件 (w) sed -n '/pattern/w output.txt'file.txt # 将匹配行写入文件
# 退出命令 (q) sed '10q'file.txt # 处理10行后退出 sed '/pattern/q'file.txt # 匹配到pattern后退出
四、地址范围
1. 行号地址
1 2 3 4 5 6 7 8 9 10 11 12
# 单行地址 sed '5命令' file.txt # 处理第5行
# 行号范围 sed '5,10命令' file.txt # 处理第5到第10行 sed '5,$命令' file.txt # 处理第5行到文件末尾 sed '1,3!命令' file.txt # 处理除第1到第3行外的所有行
# 步进地址 sed '1~2命令' file.txt # 处理奇数行(1,3,5...) sed '2~2命令' file.txt # 处理偶数行(2,4,6...)
2. 模式地址
1 2 3 4 5 6 7 8 9 10 11
# 单模式地址 sed '/pattern/命令'file.txt # 处理包含pattern的行
# 模式范围 sed '/start/,/end/命令'file.txt # 处理从包含start到包含end的行 sed '/pattern/,+3命令'file.txt # 处理包含pattern的行及其后3行 sed '/pattern/,$命令'file.txt # 处理包含pattern的行到文件末尾
# 模式与行号组合 sed '/pattern/,10命令'file.txt # 处理包含pattern的行到第10行
3. 地址否定
1 2 3 4
# 否定地址(处理不匹配的行) sed '3!命令'file.txt # 处理除第3行外的所有行 sed '/pattern/!命令'file.txt # 处理不包含pattern的行
五、正则表达式详解
1. 基本正则表达式(默认)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 字符匹配 sed 's/a/b/'file.txt # 匹配字符a sed 's/./b/'file.txt # 匹配任意字符 sed 's/[abc]/X/'file.txt # 匹配a、b或c sed 's/[^abc]/X/'file.txt # 匹配除a、b、c外的字符
# 重复匹配 sed 's/a*/X/'file.txt # 匹配0个或多个a sed 's/a\+/X/'file.txt # 匹配1个或多个a(需要转义) sed 's/a\{2,4\}/X/'file.txt # 匹配2到4个a(需要转义)
# 位置匹配 sed 's/^/X/'file.txt # 匹配行首 sed 's/$/X/'file.txt # 匹配行尾 sed 's/\<word\>/X/'file.txt # 匹配单词边界
2. 扩展正则表达式(-E选项)
1 2 3 4 5 6 7
# 使用-E选项启用扩展正则表达式 sed -E 's/a+/X/'file.txt # 匹配1个或多个a sed -E 's/a{2,4}/X/'file.txt # 匹配2到4个a sed -E 's/(group)+/X/'file.txt # 分组匹配 sed -E 's/pattern1|pattern2/X/'file.txt # OR操作 sed -E 's/(..)(..)/\2\1/'file.txt # 捕获组交换
3. 捕获组和引用
1 2 3 4 5 6 7 8
# 基本正则中的捕获组 sed 's/\(pattern\)/[\1]/'file.txt # 使用\1引用第一个捕获组 sed 's/\(first\)\(second\)/\2\1/'file.txt # 交换两个捕获组
# 扩展正则中的捕获组 sed -E 's/(pattern)/[\1]/'file.txt # 使用\1引用第一个捕获组 sed -E 's/(first)(second)/\2\1/'file.txt # 交换两个捕获组