Linux sed 命令(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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 地址和响应状态码,并替换 200OK

解决方案

sed -E 's/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).* ([0-9]+).*/\1 \2/; s/200/OK/' access.log  

解释

  1. 第一条命令提取 IP([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)和状态码([0-9]+)。
  2. 第二条命令将 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 字)

最新发布