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

news/2025/1/24 8:34:54/

内容速览
内容速览

简介

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/news/1565728.html

相关文章

小米Vela操作系统开源:AIoT时代的全新引擎

小米近日正式开源了其物联网嵌入式软件平台——Vela操作系统&#xff0c;并将其命名为OpenVela。这一举动在AIoT&#xff08;人工智能物联网&#xff09;领域掀起了不小的波澜&#xff0c;也为开发者们提供了一个强大的AI代码生成器和开发平台。OpenVela项目源代码已托管至GitH…

在VSCode中使用Jupyter Notebook

在VSCode中安裝Python和Jupyter擴展 在VSC中打开和使用 Jupyter Notebook 创建或打开 Notebook 文件&#xff1a;在 VSCode 中&#xff0c;使用命令面板&#xff08;CtrlShiftP 或 CmdShiftP&#xff09;输入 Jupyter: Create New Blank Notebook 来创建一个新的 Notebook&…

lwIP——3 内存管理

目录 1.什么是内存管理 2.lwIP内存堆 3.lwIP内存堆程序代码解析 3.1 mem_init程序解析 3.2 mem_malloc程序解析 3.3 mem_free程序解析 4.lwIP内存池 5.lwIP内存池程序代码解析 5.1 实现lwIP内存池的文件 5.1.1 memp_priv.h 5.1.2 memp_std.h 5.1.3 memp.h memp_t 枚…

Couchbase UI: Dashboard

以下是 Couchbase UI Dashboard 页面详细介绍&#xff0c;包括页面布局和功能说明&#xff0c;帮助你更好地理解和使用。 1. 首页&#xff08;Overview&#xff09; 功能&#xff1a;提供集群的整体健康状态和性能摘要 集群状态 节点健康状况&#xff1a;绿色&#xff08;正…

数据要素价值持续释放,提供新质生产力核心要素

2023年10月&#xff0c;国家数据局正式挂牌成立&#xff0c;随后&#xff0c;多个省级数据局相继成立&#xff0c;截至目前&#xff0c;31个省区市和新疆兵团均完成数据机构组建&#xff0c;全国上下贯通的数据治理布局日益明晰&#xff0c;指导数据要素价值持续释放&#xff0…

web3py+flask+ganache的智能合约教育平台

最近在学习web3的接口文档&#xff0c;使用web3pyflaskganache写了一个简易的智能合约教育平台&#xff0c;语言用的是python&#xff0c;ganche直接使用的本地区块链网络&#xff0c;用web3py进行交互。 代码逻辑不难&#xff0c;可以私信或者到我的闲鱼号夏沫mds获取我的代码…

linux-centosubuntu本地源配置

1.centos系统配置本地源 1.基本配置 虚拟机的CD/DVD设备状态要启动已连接和启动时连接&#xff0c;确定 2.对系统默认配置进行备份 [rootlocalhost etc]# mkdir yum.repos.d.bak [rootlocalhost etc]# mv yum.repos.d/* ./yum.repos.d.bak/ 3.配置本地源 4.挂载CD/DVD然后就…

TVM框架学习笔记

TVM是陈天齐等人一个开源的深度学习编译器栈,用于优化和部署机器学习模型到各种硬件后端。它支持多种前端框架,如TensorFlow、PyTorch、ONNX等,并且可以在不同的硬件平台上运行,包括CPU、GPU和专用加速器。官方文档: Apache TVM Documentation — tvm 0.20.dev0 documenta…