linux sed命令

Linux sed命令(Stream Editor,流编辑器)是一个强大的文本处理工具,用于对文本进行过滤和转换。

提示: sed命令以行为单位处理文本,支持正则表达式,是Shell脚本编程中不可或缺的工具。

语法格式

sed [选项] '命令' 输入文件
sed [选项] -e '命令1' -e '命令2' 输入文件
sed [选项] -f 脚本文件 输入文件

常用选项

选项 说明
-n 安静模式,只显示处理后的行
-e 指定要执行的sed命令
-f 从文件中读取sed脚本
-i 直接修改文件内容
-r 使用扩展正则表达式
-i.bak 修改文件前创建备份(.bak后缀)

sed命令语法

命令 语法 说明
替换 s/原字符串/新字符串/[标志] 替换匹配的文本
删除 d 删除匹配的行
插入 i\文本 在指定行前插入文本
追加 a\文本 在指定行后追加文本
读取文件 r 文件名 读取文件内容并插入
写入文件 w 文件名 将匹配行写入文件
打印 p 打印匹配的行
下一行 n 读取下一行到模式空间

使用示例

示例1:文本替换

# 将文件中的"apple"替换为"orange"
sed 's/apple/orange/g' file.txt

# 只替换每行第一个匹配的"apple"
sed 's/apple/orange/' file.txt

# 替换第2行到第5行中的"apple"
sed '2,5s/apple/orange/g' file.txt

示例2:直接修改文件

# 直接修改文件内容(危险操作)
sed -i 's/old/new/g' file.txt

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

示例3:删除行

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

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

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

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

示例4:插入和追加文本

# 在第3行前插入文本
sed '3i\插入的文本' file.txt

# 在第3行后追加文本
sed '3a\追加的文本' file.txt

# 在文件开头插入文本
sed '1i\文件头' file.txt

# 在文件末尾追加文本
sed '$a\文件尾' file.txt

示例5:打印特定行

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

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

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

# 打印从包含"start"到包含"end"的所有行
sed -n '/start/,/end/p' file.txt

示例6:使用正则表达式

# 使用扩展正则表达式(匹配数字)
sed -r 's/[0-9]+/NUM/g' file.txt

# 替换所有邮箱地址
sed -r 's/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}/EMAIL/g' file.txt

# 删除HTML标签
sed 's/<[^>]*>//g' file.html

示例7:多重操作

# 执行多个sed命令
sed -e 's/foo/bar/g' -e '/^#/d' file.txt

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

# 使用脚本文件
echo "s/old/new/g" > script.sed
echo "/^#/d" >> script.sed
sed -f script.sed file.txt

示例8:实际应用场景

# 修改配置文件中的设置
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config

# 批量重命名文件(结合find使用)
find . -name "*.txt" -exec sed -i 's/old/new/g' {} \;

# 提取日志中的特定信息
cat access.log | sed -n '/404/p' | sed 's/.*\(GET [^ ]*\).*/\1/p'

# 格式化文本
echo "one,two,three" | sed 's/,/\n/g'

示例9:高级模式匹配

# 只在包含"config"的行中替换
sed '/config/s/enabled/disabled/' file.txt

# 除了第1-10行外的所有行执行替换
sed '1,10!s/old/new/g' file.txt

# 使用分组和反向引用
echo "hello world" | sed 's/\(hello\) \(world\)/\2 \1/'
# 输出:world hello

sed地址范围

地址 说明 示例
n 第n行 5s/old/new/
$ 最后一行 $d
n,m 第n到m行 2,5p
/pattern/ 匹配模式的行 /error/d
n,+m 第n行及后面m行 5,+3p
n~m 从第n行开始,每m行 1~2p(奇数行)
注意:
  • 使用-i选项前最好先测试命令,或者使用-i.bak创建备份
  • sed默认不会修改原文件,除非使用-i选项
  • 正则表达式中的特殊字符需要使用反斜杠转义
  • 在MacOS中,sed的-i选项语法略有不同
  • 对于大型文件,sed比大多数文本编辑器更高效

sed标志说明

  • g - 全局替换(一行中的所有匹配)
  • p - 打印替换后的行
  • w 文件 - 将结果写入文件
  • i - 忽略大小写
  • 数字 - 替换第N个匹配
  • e - 执行替换命令中的shell命令

相关命令

  • awk - 更强大的文本处理工具
  • grep - 文本搜索工具
  • cut - 列提取工具
  • tr - 字符转换工具
  • perl - Perl编程语言,强大的文本处理
  • vim - 交互式文本编辑器