前言

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. vulnhub_me and my grilfriend

    解题步骤 主机nmap扫描,开放22和80端口 访问该ip,发现只能本地访问 查看源代码,提示需要使用x-forwarded-for的请求头,可以在burp suite中每次添加一个请求头,也可以使用 ...

  2. Django CSRF cookie not set.

    错误原因 由于django框架的settings.py配置了中间件,为了防止跨站请求伪造,form表单POST方式会导致出现报错 解决办法: 将'django.middleware.csrf.Csrf ...

  3. Java程序员的MacBookPro(14寸M1)配置备忘录

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 欣宸的月俸虽然很低,但还是咬着牙攒够银子,入 ...

  4. docker安装phpmyadmin

    下载docker镜像 docker pull phpmyadmin/phpmyadmin 创建容器 # 假设MySQL服务器的地址为:192.168.0.10,端口3306 # 通过3360端口访问p ...

  5. Android13冻结进程分析:如何提高设备性能和用户体验

    Android13冻结进程分析:如何提高设备性能和用户体验 本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗. ...

  6. 糟了糟了,总部被SD画完都Q了,这篇深入浅出贴助你早日实现Stable Diffusion自由

    我也不想标题党,可乐高积木版的总部大楼就是好萌啊! 我是憨憨,一个不会画画的设计师.过去半年里,AI绘画曾经多次引爆公众讨论,网络上那些精致的二次元同人插画.堪比真人的AI穿搭博主.打破次元壁的赛博C ...

  7. Midjourney的一些学习心得:如何高效的图生图

    注意本文没有什么长篇大论,全部是自己的学习心得. 心得体会:如何图生图 今天在一篇midjourney看到好图应该怎么抄. 相信经常会看到好图也想要的,但是要么抄不出感觉,要么抄过来把水印也抄了,这一 ...

  8. WPF-实现屏幕截图(一)

    源码路径:https://gitee.com/LiuShuiRuoBing/wpf_screen_cut 实现功能 实现基本的截屏窗体 鼠标随意选择截图区域 鼠标抬起时弹出按钮区 快捷键Ctrl+Al ...

  9. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (86)-- 算法导论8.2 3题

    三.用go语言,假设我们在 COUNTING-SORT的第 10行循环的开始部分,将代码改写为: 10 for j = 1 to A.length 试证明该算法仍然是正确的.它还稳定吗? 文心一言: ...