sed — 流编辑器:从入门到精通

ops/2025/1/24 14:41:48/

内容速览
内容速览

简介

sed(Stream Editor)是一个功能强大的文本处理工具,广泛应用于文本文件的自动化编辑和批量处理。它通过逐行读取文件内容并在内存中的临时缓冲区(即“模式空间”)中处理文本,实现高效的文本替换、删除、插入等操作。sed 支持使用正则表达式进行模式匹配,使得文本编辑更加灵活和高效。


sed 语法格式

sed 的基本语法格式如下:

sed [options] 'command' file(s)

其中 command 可以包含行号、正则表达式和具体命令,用于指定如何处理文件内容。

常用参数

  • -n:禁止默认输出,配合 p 命令使用来打印特定行。
  • -i:直接修改文件内容,而不是输出到标准输出。
  • -e:允许执行多个命令,常用于脚本中一次性处理多个操作。
  • -E-r:启用扩展正则表达式,简化正则表达式的书写。
  • -f:从文件中读取 sed 脚本,而不是直接在命令行中输入命令。

sed 常用命令

1. 替换命令 s

  • s/pattern/replacement/:将匹配的字符串 pattern 替换为 replacement
  • s/pattern/replacement/g:全局替换每一行中的所有匹配项。

例子

sed 's/book/books/' file          # 替换第一次出现的 "book"
sed 's/book/books/g' file         # 全面替换每一行中的 "book"

2. 删除命令 d

  • d:删除匹配的行。
  • 2d:删除第二行。
  • /pattern/d:删除所有匹配 pattern 的行。

例子

sed '/^$/d' file                  # 删除所有空行
sed '2d' file                     # 删除第二行
sed '/^$/d' file                  # 删除空白行

3. 插入命令 ai

  • a\text:在当前行之后插入文本。
  • i\text:在当前行之前插入文本。

例子

sed '/^test/a\this is a test line' file  # 在以test开头的行后插入文本
sed '2i\this is a test line' file        # 在第2行前插入文本

4. 打印命令 p

  • p:打印匹配的行。
  • -np 结合使用,只有替换的行才会被打印。

例子

sed -n 's/test/TEST/p' file       # 只打印替换过的行

5. 转换命令 y

  • y/source/destination/:将每个字符在 source 中的字符转换为 destination 中对应位置的字符。

例子

sed 'y//xyz/' file     # 将文件中所有的 'a' 转换为 'x', 'b' 转换为 'y', 'c' 转换为 'z'

6. 替换命令 c

  • c\text:用新的文本替换匹配到的整行。

例子

sed '/test/c\This is the new line' file    # 将包含 "test" 的行替换为 "This is the new line"

sed 支持的正则表达式

sed 默认使用基本正则表达式(BRE)。通过 -E 选项启用扩展正则表达式(ERE),这可以简化一些常用正则表达式的书写,例如:

  • +?{} 等变为特殊字符(在BRE中需要转义)。
  • 支持非捕获组 (?:...)(在BRE中不支持)。

区别:

  • -E:正则表达式需要使用 \ 来转义字符,比如 + 需要写成 \+
  • -E:正则表达式可以直接使用 +? 等扩展字符,无需转义。

例子

# 默认(基本正则表达式,BRE)
sed 's/\(test\)\+/\1s/' file  # 匹配一个或多个 test 并替换为 tests# 使用 -E(扩展正则表达式,ERE)
sed -E 's/(test)+/\1s/' file  # 匹配一个或多个 test 并替换为 tests

需要注意的是,即使启用了 -E,sed 仍然不支持一些高级正则功能(例如前瞻和后顾),这些需要使用更强大的工具如 perlpcregrep


复杂操作实例

1. 多点编辑:使用 -e 执行多个命令

sed -e '1,5d' -e 's/test/check/' file   # 删除前5行并替换其中的 "test" 为 "check"

2. 写入文件:使用 wr

  • w <file>:将当前处理的行写入指定文件。
  • r <file>:将文件内容读取并插入到当前行后。

例子

sed '/test/w output.txt' file        # 将包含 "test" 的行写入 output.txt
sed '/test/r file.txt' file          # 在匹配 "test" 的行后插入 file.txt 的内容

3. 字串匹配:使用 \1&

  • \1:用于替换时引用正则表达式中的捕获组,表示匹配到的第一个子串,以此类推。
  • &:表示已匹配的整个字符串,在替换部分可以引用它。

例子

  1. 使用 \1 捕获组:

    sed 's/\(love\)able/\1rs/' file    # 将 "loveable" 替换为 "lovers"
    

    在此例中,\1 引用了第一个捕获组,即 love,因此 loveable 被替换为 lovers

  2. 使用 & 已匹配字符串标记:

    sed 's/test/&-modified/' file   # 将 "test" 替换为 "test-modified"
    

    在此例中,& 引用了整个匹配的字符串 test,所以最终的结果是将 test 替换为 test-modified

4. 打印指定行:使用 np

  • n:处理下一行而不是当前行。
  • p:打印当前行。

例1:找到 “test” 行后,替换下一行中的 “aa”

sed '/test/{n; s/aa/bb/;}' file

sed 中的花括号用来将多个命令组合在一起进行执行
示例格式:sed '/pattern/{n; s/foo/bar/;}' file

例2:打印奇数行或偶数行

sed -n 'p;n' test.txt  #奇数行
sed -n 'n;p' test.txt  #偶数行

高级功能(选学)

1. 标签和分支:bt

  • b 用于跳转到脚本中的指定标签。
  • t 用于根据条件跳转(仅当有替换发生时跳转)。

例子

sed '/test/b label; /check/t label' file  # 如果匹配到 "test" 跳转到 label 标签,如果替换成功则跳转到 label

2. 保持和交换:hx

  • h:将模式空间中的内容保存到保持缓冲区。
  • x:交换模式空间和保持缓冲区的内容。

例子

sed -e '/test/h' -e '$G' file   # 将含有 "test" 的行复制到保持缓冲区,最后将保持缓冲区的内容追加到文件末尾

脚本和批量处理

sed 脚本允许将多条命令存储在一个文件中,并通过 -f 选项加载脚本。sed 也支持使用注释(以 # 开头)和多个命令的组合。

例子

sed -f scriptfile file

总结

sed 是一个功能强大的流编辑器,广泛用于文本文件的批量处理和自动化任务。通过灵活运用正则表达式和多种命令,用户可以高效地进行文本查找、替换、插入和删除等操作。掌握 sed 的常用命令和高级功能,能够显著提高文本处理的效率和灵活性,因此它成为了 Unix/Linux 系统管理员、开发者和数据处理人员的重要工具之一。


http://www.ppmy.cn/ops/152759.html

相关文章

从手动到智能:自动化三维激光扫描

三维扫描&#xff0c;是通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 传统的…

JDK的下载

JDK&#xff08;Java Development Kit&#xff09;是Java开发工具包的缩写&#xff0c;它是Java开发的核心组件。 一、JDK的组成 JDK包含了多个关键部分&#xff0c;以满足Java程序开发的需求&#xff1a; Java编译器&#xff08;javac&#xff09;&#xff1a;用于将Java源代…

2. Flink分区策略

一. Flink分区策略概述 Flink任务在执行过程中&#xff0c;一个流(stream)包含一个或多个分区(Stream partition)&#xff0c;TaskManager中的一个slot的SubTask就是一个stream partition(流分区)。 Flink分区之间进行数据传递模式有两种。 1. one-to-one模式 数据不需要重新…

Kafka后台启动命令

#保存日志 nohup ./kafka-server-start.sh ../config/server.properties > /path/to/logfile.log 2>&1 &#不保存日志 nohup ./kafka-server-start.sh ../config/server.properties >/dev/null 2>&1 & nohup: 是一个Unix/Linux命令&#xff0c;用于…

MySQL性能分析的“秘密武器”,深度剖析SQL问题

MySQL出现性能问题&#xff0c;该怎样深入分析&#xff0c;有什么工具可以使用&#xff1f;本文将分享两个实用的工具&#xff0c;让你事半功倍&#xff01; profile工具 使用profile可以分析当前查询 SQL 语句执行的资源消耗情况&#xff0c;更清楚地了解SQL执行的过程。默认…

CentOS9 安装Docker+Dpanel+onlyoffice(https、更改字体、字号、去除限制)的避坑笔记

CentOS9 安装Dockeronlyoffice&#xff08;https、更改字体、字号、去除文件大小限制&#xff09;的避坑笔记 一、安装Docker二、更新docker镜像源&#xff1a;三、安装Dpanel四、安装onlyoffice&#xff08;开启https及一些碰到的问题&#xff09;五、更改字体和字号六、去除限…

Spring Boot 启动流程解析及重点源码

文章目录 引言Spring Boot 启动类分析1、SpringBootApplication 注解2、 SpringApplication.run() 方法3、Spring Boot 启动流程详解3.1 创建 SpringApplication 实例3.2 准备环境&#xff08;Environment&#xff09;3.3 执行 ApplicationListeners3.4 刷新应用上下文&#xf…

回归算法、聚类算法、决策树、随机森林、神经网络

这也太全了&#xff01;回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机等十大机器学习算法一口气学完&#xff01;_哔哩哔哩_bilibili 【线性回归、代价函数、损失函数】动画讲解_哔哩哔哩_bilibili 14分钟详解所有机器学习算法&#xff1a;…