shell编程系列(8)-使用sed处理文本

文章目录

  • 引言
  • sed用法详解
    • 在文本中定位
    • 打印文本
    • 替换文本
    • 删除文本
    • 新增文本
  • 结语

引言

在日常工作学习中我们都会遇到要编辑文本的场景,例如我们要用vim或者nano等命令去编辑代码,处理文本文件等,这些命令的特点都是需要我们进行交互式的实时处理,但是如果我们需要在shell脚本去完成一些文本编辑处理,那该怎么办呢?
接下来就介绍一下sed命令,sed命令提供了处理文本的能力包括编辑、删除文本等,我们可以利用sed命令,在shell脚本中二次处理文本。

sed用法详解

其实sed命令功能是比较强大的,他本身也是一个脚本解释器,我们可以将sed指令编写成脚本文件,只需要在脚本文件的第一行声明#!/bin/sed即可,这种使用方式是在我们要处理较为复杂的任务时才会用到。
其实博主最常用的方式还是把sed当作命令来处理一些简单的文本操作,在本篇文章中介绍的用法,都是把sed当作命令来使用,具体的sed脚本的编写如果有同学感兴趣再专门介绍吧。
首先sed命令的用法如下:

# option 可选参数,用来控制sed行为
# command 子命令,下面会详细介绍
# inputfile 可以是文件,或者是输入流
sed [option] command inputfile

options选项如下(做了解即可):

选项说明
-n取消默认输出。
-e允许执行多个脚本。
-f从脚本文件中读取命令。
-i直接修改原始文件。
-l指定行的长度。
-r在脚本中使用扩展正则表达式。
-s默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。而GNU sed则允许把它们当做单独的文件,这样的话,正则表达式不进行跨文件匹配。
-u最低限度的缓存输入与输出。

command子命令

命令说明
a新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d删除,因为是删除啊,所以 d 后面通常不接任何参数;
i插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

在文本中定位

把大象放进冰箱一共分3步的梗大家应该都听说过,其实sed命令的使用也是类似的,使用sed命令只有2步,第一步 定位我们要编辑的行,第二步 编辑它。
再sed中定位文本行有两种方式:
方式一:使用行号定位
使用行号定位是指我们清楚的知道我们要处理哪一行,例如有一个文本文件,我们想在该文件的第1行加一些备注说明,或者我们想删除该文件的第3行,这种情况下,我们可以使用行号直接定位。示例如下:
首先,我们提前准备一个fruit.txt 文本文件作为实验文件,后面的示例都会使用这个文件,文件内容如下:
在这里插入图片描述
然后我们使用sed命令打印第一行(打印命令下面会介绍,这里主要演示行号定位),如下:

# -n 是取消默认输出,sed命令默认会将源文件内容都打印出来
# 1p 代表打印第一行,p是打印的意思,后面会讲到
sed -n 1p fruit.txt

结果如下:
在这里插入图片描述
我们也可以打印,连续的几行,如下:

sed -n 2,3p fruit.txt

结果如下,可以看到打印了第二和第三行:
在这里插入图片描述

方式二: 使用正则表达式定位
使用正则表达式定位,需要我们对正则表达式有一定的了解,正则表达式是一种功能强大的按规则匹配字符串的工具,网上教程都比较丰富,这里就不在赘述。
sed命令也支持正则表达式来定位我们要操作的文本行,例如我们要操作包含有关键字‘abc’的行,但是我们不知道是哪一行,就可以用正则表达式定位,正则表达式定位,需要将表达式放在 / / 之间,示例如下:
我们打印带有关键字‘an’的行

# 将正则表达式‘an’用/包裹起来, p代表打印
sed -n /an/p fruit.txt

结果如下,可以看到打印了orange和banana:
在这里插入图片描述

打印文本

打印文本的子命令是p 其实在上面将文本定位时候的示例都使用到了这个功能,这里就不重复演示了,这个功能主要是帮助我们打印我们想要的行,然后为下一步做准备。

替换文本

替换文本的子命令是s ,sed可以帮我们在文本内全局或者局部替换文本,例如我们想将某些单词转为大写。
示例如下,我们将fruit.txt文件中的an全部换成大写的AN:

sed -n s/an/AN fruit.txt

在这里插入图片描述
注意:

  1. 这里的替换并不会回写到源文件中,sed将an替换为AN之后,默认写入输出流里了,如果没有后续处理那么就会直接打印到终端。

删除文本

删除文本的子命令是d,可以删除我们不需要的行,示例如下:

  1. 删除fruit文件第一行:
sed 1d fruit 

结果如下
在这里插入图片描述
2. 删除带关键字‘an’的行,这里使用正则定位然后删除

sed /an/d fruit.txt

结果如下,banana和orange都被删除了
在这里插入图片描述

新增文本

新增文本行的子命令有两个ai,其中 a代表在指定位置的后面追加(append),i代表在指定位置前插入(insert)。示例如下:

  1. 我们在fruit.txt文件第二行后面追加一行grape, 如下;
sed '2 a grape' fruit.txt

结果如下:
在这里插入图片描述

  1. 在最后一行的前面插入cherry ,如下:
sed '$ i cherry' fruit.txt

结果如下:
在这里插入图片描述

注意:

  1. sed对文本的修改都不会回写到原文件里,而是写入到了输出流,默认就是终端,所以sed命令并不会破坏原来的文件

结语

sed命令其实还有很多用法这里都没有列出来,只是挑了一些博主认为常用的功能介绍,如果感兴趣可以通过 man sed命令,查询最全的使用说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/238731.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业存货库存综合分析全流程图

上期我们谈到了 诊断存货管理的4大维度,今天我们进一步全方位、全周期的分析企业内存货的问题。 企业存货是企业用于生产或销售的货品,是企业价值增值变现的载体,但是如果一旦没有产生交易,存货就很有可能带来损失。存货伴随着企业…

【力扣周赛】第 369 场周赛(⭐记忆化搜索 树形DP)

文章目录 竞赛链接Q1:2917. 找出数组中的 K-or 值竞赛时代码——按题意模拟 Q2:2918. 数组的最小相等和竞赛时代码——分类讨论 Q3:2919. 使数组变美的最小增量运算数⭐⭐⭐竞赛时代码——动态规划解法2——记忆化搜索 翻译成递推 Q4&#xf…

SQL Server 数据库,使用函数查询统计信息

4.1 在查询中使用函数 在前面章节已经学习了一些简单的增、删、改、查询的T-SOL.语句,但是为了更方便快捷地完 成大量的任务,SOLServer提供了一些内部函数,可以和SOLServer的SELECT语句联合使用,也可 以与UPDATE和INSERT一起使用&…

关于加强型葡萄酒的类型有哪些?

加强型葡萄酒指的是在酿造过程中或酿造完后,添加酒精提高葡萄酒酒精度的葡萄酒,一般加强型葡萄酒的酒精度数都能达到15度以上。那么,云仓酒庄的品牌雷盛红酒分享加强型葡萄酒的类型有哪些呢? 云仓酒庄多品牌多代言运营模式&#…

SpringBoot3.x + mp代码生成器(更新系列)

小伙伴们,有没有这样一个体验,每次开始写一个项目时,搭建项目环境,建entity,mapper,service,controller层文件的感到繁琐,这属实体力活呀!然而,自从有了Mybat…

NRF24L01 无线收发模块与 Arduino 的应用

NRF24L01 是一款常用的无线收发模块,与 Arduino 兼容性良好,可以用于实现无线通信和数据传输。本文将介绍如何将 NRF24L01 模块与 Arduino 配合使用,包括硬件的连接和配置,以及相应的代码示例。 一、引言 NRF24L01 是一款基于 2.…

ts学习05-typeScript中的类

类的定义 class Person {name: string; //属性 前面省略了public关键词constructor(n: string) {//构造函数 实例化类的时候触发的方法this.name n;}run(): void {console.log(this.name);} } var p new Person("张三");p.run();class Person {name: string;//…

【linux】日志有哪些

Linux系统日志主要有以下几种类型: 内核及系统日志:这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中设置决定内核消息及各种系统程序消息记录到什么位置。/var/log/message:该日志文件存放了内核消息…

webGL开发学科演示项目方案

开发学科演示项目需要考虑到教育目标、互动性和用户体验。以下是一个可能的技术方案,可用于实现这样的项目,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.WebGL 框架: 选择…

Kafka 保证消息消费全局顺序性

当有消息被生产出来的时候,如果没有指定分区或者指定 key ,那么消费会按照【轮询】的方式均匀地分配到所有可用分区中,但不一定按照分区顺序来分配 我们知道,在 Kafka 中消费者可以订阅一个或多个主题,并被分配一个或多…

旋转立方体.html(网上收集5)

<!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>旋转立方体</title><style>#cube {width: 200px;height: 200px;position: relative;transform-style: preserve-3d;animation: rotate 6s infinite linear;mar…

记一次SQL Server磁盘突然满了导致数据库锁死事件is full due to ‘LOG_BACKUP‘.

背景 最近我们的sql server 数据库磁盘在80左右&#xff0c;需要新增磁盘空间。还是处以目前可控的范围内&#xff0c;但是昨天晚上告警是80%&#xff0c;凌晨2:56分告警是90%&#xff0c;今天早上磁盘就满了。 经过 通过阿里云后台查看&#xff0c;磁盘已经占据99%&#xff0c…