使用 sed 处理文本文件

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

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

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

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

Linux(Ubuntu) 系统已经自带,mac OS系统也默认安装,Windows 需要安装一个名为 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 的行 \a regexpb 匹配符合正则表达式 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 替换使用正则

匹配到的内容

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

标记描述 标记含义 g 行内全面替换 Ng 行内从第N处匹配开始替换 \1…\9 子串匹配(?)

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

字符 行为描述 示例 ^ 行首匹配

匹配所有以sed开头的行 $ 行尾匹配

匹配所有以sed结尾的行 . 非换行符单个匹配

匹配s后接一个任意字符,最后是d * 0至多个字符匹配

匹配一个或多个空格后紧跟sed的行;

匹配se后紧跟0至多个d的行 [] 字符组内单个匹配

匹配sed和Sed [^] 字符组外单个匹配 /[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行 (..) 匹配子串,以在之后使用 s/(love)able/\1rs,loveable被替换成lovers,见注3 & 匹配搜索串,以在之后使用 s/love/ &/,love被替换成 love \< 匹配单词的开始

匹配包含以sed开头的单词的行 > 匹配单词的结束

匹配包含以sed结尾的单词的行 x\ 匹配字符x,m次

匹配含连续5个d的行 x\ 匹配字符x,至少m次

匹配至少含连续5个d的行 x\ 匹配字符x,至少m次,至多n次

匹配含连续5到9个d的行

  • 注释掉 build.gradle 中 implementation 'org.greenrobot:greendao:3.3.0
&#x5728;&#x542B;&#x6709; org.greenrobot:greendao:3.3.0 &#x7684;&#x884C;&#x4E0A;&#x8FDB;&#x884C;&#x66FF;&#x6362;&#xFF0C;&#x66FF;&#x6362;i&#x4E3A; //i
sed '/org.greenrobot:greendao:3.3.0/s/i/\/\/i/' build.gradle
&#x66FF;&#x6362; implementation 'org.greenrobot:greendao:3.3.0 &#x4E3A; &#x5728;&#x5176;&#x4E4B;&#x524D;&#x52A0;&#x4E0A;//
sed "s/implementation 'org.greenrobot:greendao:3.3.0'/\/\/&/" build.gradle
  • 当命令的匹配模式有单引号 ' '时,使用双引号 " "包围命令。其他情况下可使用单引号包围命令。
  • 当命令的匹配模式或要替换的文本有斜线 /时,需在前追加反斜线 \/方可正常使用。

Original: https://www.cnblogs.com/wx2020/p/16269905.html
Author: wx2020
Title: 使用 sed 处理文本文件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578918/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java bean与xml 互转(对象转xml、xml转对象)

    日常吐槽: 好久都没怎么分享自已了…… ╮(╯▽╰)╭,最近有个需求,需要把 bean对象 转成 xml 文件,然后 xml 文件 转成对象 ( 生成 与 …

    Java 2023年5月29日
    0103
  • 通俗易懂讲 CompletableFuture

    使用Future获得异步执行结果时,要么调用阻塞方法get(),要么轮询看isDone()是否为true,这两种方法都不是很好,因为主线程也会被迫等待。 从Java 8开始引入了C…

    Java 2023年6月8日
    079
  • java_day05

    Java流程控制 用户交互Scanner Java给我们提供了一个工具类,让我们可以获取用户的输入。java.util.Scanner 是Java5的新特性 基本语法 Scanne…

    Java 2023年6月5日
    0107
  • docker进阶

    Docker Compose Docker DockerFile build run 手动操作,单个容器 微服务,100个微服务,依赖关系 Docker Compose来轻松高效的…

    Java 2023年6月9日
    0167
  • @Import 源码解析

    转发请注明出处: @Import通过快速导入的方式实现把实例加入spring的IOC容器中;一般@EnableXXX注解是通过@Import实现具体的功能(@EnableXXX注解…

    Java 2023年6月8日
    059
  • 顺序结构(Java)

    基本介绍 Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一字一句执行 顺序结构是最简单的算法结构 语句与语句之间,框与框之间是按照从上到下的顺序进行,它是由若干个依次…

    Java 2023年6月9日
    066
  • 没那么简单的单例模式

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 什么是单例 单例的应用场景 单…

    Java 2023年6月15日
    066
  • 基于Redis实现延时队列服务

    背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默…

    Java 2023年6月7日
    060
  • Docker(2)

    复杂安装详说 mysql 主从复制 主服务容器启动与配置 新启主服务容器 docker run -p 3307:3306 –name mysql-master -v /usr/l…

    Java 2023年6月8日
    085
  • Buuctf-Web-[极客大挑战 2019]Havefun

    前言 刷题网址:https://buuoj.cn/challenges#[极客大挑战 2019]Havefun 首先打开题目,发现是一只猫猫,如下图 二话不说直接看源代码,发现了东…

    Java 2023年6月13日
    080
  • Java面向对象(五)

    Java面向对象(五) Java面向对象(五) – 十六、面向对象特征之三: 多态性 16.1 多态性的定义: 16.2 多态性的使用: 16.3 多态典型例题 十七、…

    Java 2023年6月9日
    070
  • day11-多线程

    进程、线程介绍 Java中 线程的实现方式 Thread 类 Runnable 接口 Callable 接口 线程相关的方法 线程安全问题 – 同步技术 线程等待唤醒机…

    Java 2023年6月6日
    097
  • java可变参数

    可变参数 用法: public void test(int… i){} //类型后边加… 本质是数组 参考文档: 方法中有多个参数是,可变参数必须放在最后 …

    Java 2023年6月8日
    080
  • 【翻译】Nginx的HTTP负载均衡

    将请求负载均衡到多个应用实例是一个常用的技术,它起到优化资源使用率、最大化吞吐量、降低延迟、保证容错性。 Nginx是一个非常有效的HTTP负载均衡工具,它将请求分发到多个应用服务…

    Java 2023年5月30日
    067
  • 链表的操作(但某些操作的结果有误)

    cpp;gutter:false;</p> <h1>include</h1> <h1>include</h1> <…

    Java 2023年6月7日
    057
  • OO第二单元总结

    OO第二单元电梯总结 OO第二单元电梯总结 架构模式 hw5 一级生产者消费者模型with策略类分离 关于策略类的提取: 关于优化实现了: hw6 增加了两个电梯子类的一级生产者消…

    Java 2023年6月13日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球