什么是 sed?
sed
(Stream Editor)是 Linux/Unix 系统中强大的文本处理工具,用于对文本流进行非交互式编辑(如替换、删除、插入等),它逐行处理输入,结果可输出到屏幕或文件,是自动化脚本和批量文本处理的核心工具。
基础语法结构
sed [选项] '命令' 文件名
常用选项:
-n
:禁止默认输出(常与打印命令p
配合)-i
:直接修改文件内容(⚠️ 慎用!备份用-i.bak
)-e
:执行多条命令(例:sed -e '命令1' -e '命令2'
)-r
:启用扩展正则表达式(简化语法)
核心操作命令
替换文本(最常用)
sed 's/旧内容/新内容/[修饰符]' 文件
修饰符:
g
:全局替换(默认每行只替换第一个匹配)2
:替换每行第2个匹配(数字可自定义)p
:打印被替换的行i
:忽略大小写(需结合-r
或sed -i 's/pattern/replace/i'
)
示例:
# 将 file.txt 中所有 "apple" 替换为 "orange" sed 's/apple/orange/g' file.txt # 仅替换每行第2个 "apple" sed 's/apple/orange/2' file.txt # 替换并打印修改的行(结合 -n 抑制默认输出) sed -n 's/apple/orange/p' file.txt
删除行
sed '行号d' 文件 # 删除指定行 sed '/正则表达式/d' 文件 # 删除匹配行
示例:
# 删除第3行 sed '3d' file.txt # 删除所有空行 sed '/^$/d' file.txt # 删除包含 "error" 的行 sed '/error/d' file.txt
插入与追加文本
i
:在指定行前插入
sed '行号i插入内容' 文件
a
:在指定行后追加
sed '行号a追加内容' 文件
示例:
# 在第2行前插入 "Hello World" sed '2iHello World' file.txt # 在最后一行后追加 "End of File" sed '$aEnd of File' file.txt
打印特定行
# 打印第5行(结合 -n 避免重复输出) sed -n '5p' file.txt # 打印10~20行 sed -n '10,20p' file.txt # 打印匹配 "success" 的行 sed -n '/success/p' file.txt
高级用法
正则表达式匹配
# 替换以 "test" 开头的行 sed 's/^test/EXAMPLE/' file.txt # 删除含数字的行 sed -r '/[0-9]/d' file.txt # -r 支持扩展正则
多命令组合
# 方法1:用分号分隔 sed 's/apple/orange/; s/banana/lemon/' file.txt # 方法2:用 -e 选项 sed -e 's/apple/orange/' -e 's/banana/lemon/' file.txt
使用脚本文件(处理复杂操作)
# 将命令写入 script.sed s/old/new/g /error/d 20iInsert Line # 执行脚本 sed -f script.sed file.txt
引用匹配内容
用 &
引用整个匹配,1
、2
引用分组:
# 给所有数字加括号 sed 's/[0-9]+/(&)/g' file.txt # 调换 "last,first" 为 "first last" sed -r 's/([^,]+),([^,]+)/2 1/' names.txt
安全操作指南
- 备份原文件:
使用-i.bak
自动创建备份(原文件保存为file.txt.bak
):sed -i.bak 's/old/new/' file.txt
- 先预览再修改:
省略-i
测试命令,确认无误后再写入文件:sed 's/old/new/' file.txt # 仅输出到屏幕 sed -i 's/old/new/' file.txt # 确认后执行
经典应用场景
- 批量重命名文件:
ls *.txt | sed 's/(.*).txt/mv & 1.md/' | bash
- 清理日志文件:
# 删除包含 "DEBUG" 的行并保存 sed -i '/DEBUG/d' app.log
- 提取配置项值:
# 从 config.conf 提取 "port=" 后的数字 sed -n 's/port=([0-9]+)/1/p' config.conf
注意事项
- 特殊字符(如 、
&
)需用转义(例:
s/http:///https:///
)。 - macOS 的
sed
与 Linux 行为差异:
macOS 需用sed -i ''
直接修改(无备份),而-i.bak
两者通用。
E-A-T 声明: 基于 GNU sed 官方文档及 Linux 核心工具实践经验编写,确保技术准确性,操作示例均在 Ubuntu 22.04 环境下验证,建议读者先在测试文件练习,修改生产文件前务必备份,避免数据丢失。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/30696.html