前言

sed 是一款 GNU 流编辑器,可以按照指定的规则去处理文本文件或流,其强大的功能使用户在命令中快捷地修改文本文件成为可能。

它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:

首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行,先将处理得到的结果保存到一个暂存缓冲区中(也称为保存空间),再将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

安装

Linux(Ubuntu) 系统已经自带,mac OS系统也默认安装,Windows 需要安装一个名为 msys2 的软件,安装过程暂略。

Ps. 经搜索,Windows 也可以安装一款名为 Gow 的软件,这一款软件也含有一些简单 Linux 命令,比 msys2 更加轻量,下载地址在这里

使用

摘要

sed [选项] [选项参数] [脚本] [输入文件] [其他参数]

基本选项及其参数

短选项 功能 对应长选项
-n 取消默认输出 --quiet, --silent
-e 脚本 添加脚本至要运行的命令 --expression=脚本
-f 脚本文件 添加脚本文件的内容到要运行的命令 --file=脚本文件
-i [后缀] 编辑已存在的文件。如果提供了后缀则生成指定后缀的备份文件 --in-place[=后缀]
-E, -r 在脚本中使用扩展的正则表达式 --regexp-extended

脚本

格式

[addr1[,addr2]][!]{命令}

地址
  • 脚本中可以不指定地址,这样命令将会为输入的所有行执行
  • 如果脚本给出了1个地址,那么命令将只会为匹配此地址上的行执行(单地址类型)
  • 如果脚本给出了2个地址,那么命令将会对从匹配的第一个地址到第二个地址的区域的所有输入行执行 (双地址类型)
  • 命令前的 ! 会使命令在指定地址或地址范围以外的区域执行
地址类型
  • 单地址类型

    类型描述 类型含义
    number (数字) 只匹配行号为 number 的行
    first~step (eg:1~2) 匹配每一个第 step 行并从 first 开始计数
    $ 只匹配最后一行
    /regexp/ 匹配符合正则表达式 regexp 的行
    \aregexpb 匹配符合正则表达式 regexp 的行,其中的a、b为任意字符,用于辅助定位
  • 双地址类型

    类型描述 类型含义
    p,q (数字) 匹配从第 p 行开始到第 q 行的范围
    p,+N (数字) 匹配从第 p 行开始到其之后的 N 行
    p,~N (数字) 匹配第 p 行和从第 p 行开始每隔 N 行后的下一行
    p, /regexp/ (p为数字,regexp为正则表达式) 匹配从第 p 行开始,直到首次发现符合正则表达式regexp的行(不含第 p 行,见注1)

注1:

  • 若 p 为 0,则含义为 匹配从文件首字符开始,直到首次发现符合正则表达式regexp的行
  • 若 p 为 大于 0 的行号,则 regexp 不会对第 p 行进行测试
命令
命令描述 命令含义
a \ text 在匹配的行后追加文本text
i \ text 在匹配的行前插入文本text
c \ text 用文本text替换匹配行或范围
d 删除匹配行或范围
p 输出匹配行或范围
s/regexp/replacement/[替换标记] 在匹配行或范围内,用 replacement 替换使用正则 regexp 匹配到的内容

注2:追加 / 插入 / 替换多行时,要在 text 内部需换行的位置用反斜杠续行。

替换标记
标记描述 标记含义
g 行内全面替换
Ng 行内从第N处匹配开始替换
\1...\9 子串匹配(?)
正则表达式元字符集

由于脚本中的命令支持正则表达式,在这就不得不提一下正则表达式的元字符集,不同的元字符在正则表达式中可以覆盖不同的匹配场景。

字符 行为描述 示例
^ 行首匹配 /^sed/匹配所有以sed开头的行
$ 行尾匹配 /sed$/匹配所有以sed结尾的行
. 非换行符单个匹配 /s.d/匹配s后接一个任意字符,最后是d
* 0至多个字符匹配 /*sed/匹配一个或多个空格后紧跟sed的行; /sed*/匹配se后紧跟0至多个d的行
[] 字符组内单个匹配 /[sS]ed/匹配sed和Sed
[^] 字符组外单个匹配 /[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行
\(..\) 匹配子串,以在之后使用 s/\(love\)able/\1rs,loveable被替换成lovers,见注3
& 匹配搜索串,以在之后使用 s/love/ **&**/,love被替换成 **love**
\< 匹配单词的开始 /\<sed/匹配包含以sed开头的单词的行
\> 匹配单词的结束 /sed\>/匹配包含以sed结尾的单词的行
x\ 匹配字符x,m次 /d\{5\}/ 匹配含连续5个d的行
x\ 匹配字符x,至少m次 /d\{5,\}/ 匹配至少含连续5个d的行
x\ 匹配字符x,至少m次,至多n次 /d\{5,9}/ 匹配含连续5到9个d的行

范例

  • 注释掉 build.gradle 中 implementation 'org.greenrobot:greendao:3.3.0
# 在含有 org.greenrobot:greendao:3.3.0 的行上进行替换,替换i为 //i
sed '/org.greenrobot:greendao:3.3.0/s/i/\/\/i/' build.gradle
# 替换 implementation 'org.greenrobot:greendao:3.3.0 为 在其之前加上//
sed "s/implementation 'org.greenrobot:greendao:3.3.0'/\/\/&/" build.gradle

说明

  • 当命令的匹配模式有单引号' '时,使用双引号" "包围命令。其他情况下可使用单引号包围命令。
  • 当命令的匹配模式或要替换的文本有斜线/时,需在前追加反斜线\/方可正常使用。

使用 sed 处理文本文件的更多相关文章

  1. sed处理文本文件

    SQL文件处理在以select 开通的行的上一行添加 explain analyze 并写入文本(-i)sed -i '/^select/i\explain analyze' test_load2.l ...

  2. sed语法

    Sed 命令行 以下是我们可以指定单引号在命令行sed命令的格式如下: sed [-n] [-e] 'command(s)' files 例子 考虑一下我们有一个文本文件books.txt待处理,它有 ...

  3. SaltStack常用的模块

    目录 1. SaltStack模块介绍 2. SaltStack常用模块 2.1 SaltStack常用模块之network 2.1.1 network.active_tcp 2.1.2 networ ...

  4. sed命令给文本文件的每行的行首或者行尾添加文字

    在每行的头添加字符,比如"HEAD",命令如下: sed 's/^/HEAD&/g' test.file 在每行的行尾添加字符,比如“TAIL”,命令如下: sed 's/ ...

  5. 利用sed把一行的文本文件改成每句一行

    事实证明,至少在mac-osx上,利用sed插入一个换行符是很难的,常规的命令如: sed 's/[\.\?\!]/\n' file 是不可能的,会把那些标点符号变成n. 尝试了SO上的很多方法 ht ...

  6. 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od

    awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk ''  | output 1.首先要知道形式 awk 'command' fi ...

  7. sed命令详解

    搜索 纠正错误  添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...

  8. 纯命令行的编辑利器:用好 awk 与 sed

    awk 的基本语法 awk 是模式查找与处理语言,是文本处理的利器.使用 awk 可以只用一条简单的命令完成复杂的文本数据处理. awk 命令的基本结构为: awk '模式 {处理}' 文件 比如,打 ...

  9. Linux查找命令:grep,awk,sed

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  10. awk sed 总结

    Awk总结笔记 介绍 90年代 new awk :nawk Linux 的是gawk 我们简化awk 用法 #  awk [options ] ‘scripts’ file1 file2 .... # ...

随机推荐

  1. jQuery事件冒泡和默行为

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Python类与面向对象

    Python类与面向对象 一.面向对象 1.1 面向对象概述 面向对象与面向过程? 面向过程编程的基本思想是:分析解决问题的步骤,使用函数实现每步对应的功能,按照步骤的先后顺序依次调用函数.面向过程只 ...

  3. 小白终于解决了在学习Go中不知道Makefile是什么的难题

    如何在Go中使用Makefile 1.Makefile是什么 Makefile是一种构建工具,用于在项目中定义和执行一系列命令.它通常包含了一些规则和目标,用于编译.测试.运行和清理项目. 2.Mak ...

  4. 发布关于PostGIS对于USD格式的拓展

    我们非常高兴的发布为了一年一度的SIGGRAPH 2023发布关于为PostGIS支持USD格式的新拓展. 新添加了3个函数 ST_AsUSDA(geom geometry, usd_root_nam ...

  5. 【Unity3D】运动模糊特效

    1 运动模糊原理 ​ 开启混合(Blend)后,通过 Alpha 通道控制当前屏幕纹理与历史屏幕纹理进行混合,当有物体运动时,就会将当前位置的物体影像与历史位置的物体影像进行混合,从而实现运动模糊效果 ...

  6. Hugging News #0814: Llama 2 学习资源大汇总 🦙

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  7. WPF实现Element UI风格的日期时间选择器

    背景 业务开发过程中遇到一个日期范围选择的需求,和Element UI的DateTimePicker组件比较类似,由两个日历控件组成,联动选择起始时间和结束时间. 问题 WPF中提供了一个DatePi ...

  8. Inno SetUp安装包:如何在程序安装时卸载驱动程序

    pnputil命令行方式卸载 如果您想通过命令行卸载.INF文件的驱动程序,您需要使用PnPUtil命令.以下是一个示例: pnputil /delete-driver oem0.inf /unins ...

  9. 《SQL与数据库基础》19. 日志

    目录 日志 错误日志 二进制日志 日志格式 日志查看 日志删除 查询日志 慢查询日志 本文以 MySQL 为例 日志 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysql 启动 ...

  10. AI绘图开源工具Stable Diffusion WebUI前端API对接

    背景 本文主要介绍 AI 绘图开源工具 Stable Diffusion WebUI 的 API 开启和基本调用方法,通过本文的阅读,你将了解到 stable-diffusion-webui 的基本介 ...