sed命令

sed 命令 #

sed(Stream Editor)是一个强大的流编辑器,用于对文本进行过滤和转换。它可以执行插入、删除、替换、提取等操作,是 Linux 文本处理的核心工具之一。

语法 #

sed [选项] '命令' [输入文件...]

sed [选项] -f 脚本文件 [输入文件...]

常用选项 #

选项 描述
-e 命令 添加要执行的命令
-f 文件 从文件中添加命令
-i[后缀] 直接修改文件(就地编辑),可选择创建带后缀的备份
-n 禁止自动打印模式空间
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立的,而不是将它们视为单个连续的长流

常用命令 #

命令 描述
s/正则/替换/[标志] 替换匹配的文本
p 打印匹配的行
d 删除匹配的行
a\文本 在匹配行后追加文本
i\文本 在匹配行前插入文本
c\文本 用文本替换匹配的行
y/源字符/目标字符/ 转换字符
q 退出 sed
n 读取下一行
r 文件 从文件读取文本
w 文件 将匹配的行写入文件

替换标志 #

标志 描述
g 全局替换(替换所有匹配)
数字 只替换第 n 个匹配
p 打印包含替换的行
i 忽略大小写
w 文件 将替换结果写入文件

地址匹配 #

地址格式 描述
数字 匹配特定行号
$ 匹配最后一行
/正则/ 匹配正则表达式
地址1,地址2 匹配从地址 1 到地址 2 的范围
地址! 匹配除地址外的所有行
地址~步长 从地址开始,每隔步长行匹配一次

常见用法 #

1. 替换文本 #

# 替换每行中第一次出现的"old"为"new"
sed 's/old/new/' file.txt

# 全局替换(替换所有匹配)
sed 's/old/new/g' file.txt

# 只替换第2次出现的"old"
sed 's/old/new/2' file.txt

# 忽略大小写
sed 's/old/new/i' file.txt

2. 删除行 #

# 删除空行
sed '/^$/d' file.txt

# 删除包含"pattern"的行
sed '/pattern/d' file.txt

# 删除第5行
sed '5d' file.txt

# 删除第5行到第10行
sed '5,10d' file.txt

# 删除最后一行
sed '$d' file.txt

3. 打印特定行 #

# 打印包含"pattern"的行
sed -n '/pattern/p' file.txt

# 打印第5行到第10行
sed -n '5,10p' file.txt

# 打印文件的第一行
sed -n '1p' file.txt

# 打印文件的最后一行
sed -n '$p' file.txt

4. 添加和插入文本 #

# 在包含"pattern"的行后添加文本
sed '/pattern/a\新文本' file.txt

# 在包含"pattern"的行前插入文本
sed '/pattern/i\新文本' file.txt

# 在第5行后添加文本
sed '5a\新文本' file.txt

5. 替换整行 #

# 将包含"pattern"的行替换为新文本
sed '/pattern/c\新文本' file.txt

# 将第5行替换为新文本
sed '5c\新文本' file.txt

6. 多个命令 #

# 使用分号分隔多个命令
sed 's/old/new/g; s/foo/bar/g' file.txt

# 使用-e选项指定多个命令
sed -e 's/old/new/g' -e 's/foo/bar/g' file.txt

7. 直接修改文件 #

# 直接修改文件(不创建备份)
sed -i 's/old/new/g' file.txt

# 直接修改文件并创建备份
sed -i.bak 's/old/new/g' file.txt

8. 使用正则表达式 #

# 使用基本正则表达式
sed 's/[0-9]\{3\}/NUMBER/g' file.txt

# 使用扩展正则表达式
sed -E 's/[0-9]{3}/NUMBER/g' file.txt

9. 引用和转义 #

# 在替换中使用捕获组
sed -E 's/(foo|bar)/\1-modified/g' file.txt

# 在替换中使用变量
name="John"
sed "s/USER/$name/g" file.txt

10. 高级用法 #

# 只处理文件的特定部分
sed '/start/,/end/s/old/new/g' file.txt

# 每隔2行处理一次
sed '1~2s/old/new/g' file.txt

# 除了第5行外都替换
sed '5!s/old/new/g' file.txt

# 从文件读取替换内容
sed '/pattern/r add_file.txt' file.txt

# 将匹配行写入文件
sed -n '/pattern/w output.txt' file.txt

实用示例 #

1. 删除 HTML 标签 #

sed 's/<[^>]*>//g' file.html

2. 在每行开头添加行号 #

sed = file.txt | sed 'N;s/\n/. /'

3. 将 DOS/Windows 格式的文本转换为 Unix 格式 #

sed 's/\r$//' file.txt

4. 提取特定行之间的内容 #

sed -n '/START/,/END/p' file.txt

5. 注释或取消注释配置文件中的行 #

# 注释包含"pattern"的行
sed 's/^.*pattern.*$/#&/' file.conf

# 取消注释以#开头的行
sed 's/^#\(.*\)$/\1/' file.conf

提示 #

  • 使用单引号包围 sed 命令可以防止 shell 解释特殊字符
  • 使用双引号时,可以在命令中使用变量
  • 使用-i选项时要小心,它会直接修改原文件
  • 在处理大文件时,sed 比许多文本编辑器更高效
  • 使用-n选项可以抑制默认输出,只显示特定的行
  • 在复杂的 sed 脚本中,可以使用#添加注释
  • 使用-E-r选项可以使用扩展正则表达式,简化语法
  • 在处理包含特殊字符的文本时,可以使用不同的分隔符,如s|old|new|g
  • sed 是行处理工具,默认不处理跨行的模式
  • 对于非常复杂的文本处理任务,可能需要结合使用 sed、awk 和 grep