Linux sed 命令(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Linux 系统中,文本处理是一项高频操作。无论是修改配置文件、处理日志信息,还是自动化脚本开发,开发者常常需要快速定位、替换或删除特定内容。Linux sed 命令(流编辑器)正是为此而生的工具。它如同一把“瑞士军刀”,以简洁的语法和强大的功能,成为文本处理领域的核心工具之一。本文将从基础到进阶,结合实际案例,帮助读者掌握 sed 的核心用法,解决常见场景中的文本编辑问题。
什么是 sed?
sed(Stream Editor) 是一个基于行的文本流编辑器。它的设计哲学是“流水线式处理”——逐行读取输入内容,根据预设规则进行修改,最后输出结果。与交互式编辑器(如 Vim)不同,sed 更适合在命令行中快速执行批量操作,尤其适合嵌入到 Shell 脚本中。
核心特点
- 非交互式:直接通过命令行参数或脚本文件指定操作规则。
- 流处理:逐行处理输入,适合处理大型文件或实时数据流。
- 正则表达式支持:通过正则表达式精准匹配文本模式。
- 可组合性:支持多条命令组合,实现复杂逻辑。
基本命令结构
sed [选项] '命令' 文件
例如:
sed 's/old/new/' file.txt
此命令将 file.txt
中的第一处匹配到的 old
替换为 new
。
基础操作:替换与删除
1. 替换文本(s
命令)
sed
最经典的用法是通过 s
(substitute)命令进行替换。其基本语法为:
s/搜索模式/替换文本/[修饰符]
示例 1:单次替换
echo "Hello world" | sed 's/world/planet/'
示例 2:全局替换(g
修饰符)
若需替换某行中所有匹配项,添加 g
:
echo "apple banana apple" | sed 's/apple/orange/g'
形象比喻
可以把 s
命令想象成“文字处理器”:
s
是“搜索”动作,/
是“分隔符”,g
是“全局覆盖”按钮。
2. 删除行(d
命令)
d
(delete)命令用于删除符合条件的行。例如:
sed '/error/d' log.txt
实际场景
假设有一个日志文件 access.log
,要删除所有以 404
开头的行:
sed '/^404/d' access.log > filtered.log
3. 查看内容(p
命令)
p
(print)命令用于打印匹配行。结合 -n
选项可控制输出:
sed -n '/success/p' result.txt
进阶功能:正则表达式与范围控制
1. 正则表达式(Regex)支持
sed 支持正则表达式来匹配复杂模式。例如:
sed '/^[0-9]/p' data.txt
常用正则符号
符号 | 含义 | 示例 |
---|---|---|
. | 匹配任意单个字符 | a.c 匹配 "abc", "a2c" |
* | 匹配前一项零次或多次 | a*b 匹配 "ab", "aab" |
^ | 行首锚定 | ^start 匹配以 "start" 开头的行 |
$ | 行尾锚定 | end$ 匹配以 "end" 结尾的行 |
2. 行范围操作
通过指定行号或模式,可对特定范围执行操作。例如:
sed '5,10d' file.txt
动态范围
也可以用模式定义范围,如:
sed '/START/,/END/ s/old/new/g' config.conf
3. 插入与追加文本
- 插入(
i
):在指定行前插入文本:sed '3i\New line before 3rd line' text.txt
- 追加(
a
):在指定行后追加文本:sed '$a\End of file' text.txt # 在文件末尾追加
实战案例:处理日志文件
案例 1:过滤并格式化日志
假设有一个 Nginx 日志文件 access.log
,格式如下:
192.168.1.1 - - [10/Oct/2023:12:00:00 +0800] "GET /index.html HTTP/1.1" 200 612
目标:提取 IP 地址和响应状态码,并替换 200
为 OK
。
解决方案
sed -E 's/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).* ([0-9]+).*/\1 \2/; s/200/OK/' access.log
解释:
- 第一条命令提取 IP(
[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
)和状态码([0-9]+
)。 - 第二条命令将
200
替换为OK
。
案例 2:批量替换配置文件
在 httpd.conf
中,需将所有 ServerName
的值从 localhost
改为 example.com
:
sed -i '/ServerName/s/localhost/example.com/' httpd.conf
技巧:
-i
参数直接修改原文件(需谨慎使用)。- 使用
/ServerName/
确保仅替换该字段的值。
常见问题与技巧
1. 临时修改 vs 永久修改
- 临时输出:默认行为是输出到标准输出,需重定向保存。
sed 's/old/new/' file.txt > new_file.txt
- 直接修改文件:用
-i
选项(推荐加后缀备份):sed -i.bak 's/old/new/' file.txt # 生成 file.txt.bak 备份
2. 处理多行内容
当需要跨行操作时,可使用 N
命令加载下一行,或 D
命令删除部分内容。例如:
sed 'N; s/\n/ /' data.txt
3. 脚本化复杂操作
对于多步骤任务,可将命令写入脚本文件 script.sed
:
s/error/warning/g
/unused/d
i\# This is a comment line
执行时:
sed -f script.sed input.txt
结论
Linux sed 命令 是文本处理的利器,其简洁的语法和强大的功能使其成为开发者必备的工具。通过掌握替换、删除、正则表达式及范围控制等核心功能,用户可高效完成从简单修改到复杂文本处理的任务。无论是日常运维还是自动化脚本开发,sed 都能显著提升文本处理的效率。
建议读者通过实际操作加深理解,例如尝试修改本机的配置文件或日志文件。随着使用频率的增加,sed 将逐渐成为您 Linux 工具链中不可或缺的一部分。
(全文约 1800 字)