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.mzph.cn/news/188854.shtml

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

相关文章

使用visual Studio MFC 平台实现对灰度图添加椒盐噪声,并进行均值滤波与中值滤波

平滑处理–滤波 本文使用visual Studio MFC 平台实现对灰度图添加椒盐噪声,并进行均值滤波与中值滤波 关于其他MFC单文档工程可参考 01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 02-visual Studio MFC 绘制单一颜色三角形、渐变颜色边…

Visual Studio通过ClaudiaIDE插件设置背景图片

首先,在VS菜单栏上选择扩展-管理扩展,搜索插件为 ClaudiaIDE, 下载完成之后,关闭VS,点击Modify按钮安装: 等待安装完成,进入 VS , 打开 工具----选项---- ClauDiaIDE 界面 这个是背景色调 我选的…

2023-12-01 AndroidR 系统在root目录下新建文件夹和创建链接,编译的时候需要修改sepolicy权限

一、想在android 系统的根目录下新建一个tmp 文件夹,建立一个链接usr链接到data目录。 二、在system/core/rootdir/Android.mk里面的LOCAL_POST_INSTALL_CMD 增加 dev proc sys system data data_mirror odm oem acct config storage mnt apex debug_ramdisk tmp …

共享单车停放(简单的struct结构运用)

本来不想写这题的&#xff0c;但是想想最近沉迷玩雨世界&#xff0c;班长又问我这题&#xff0c;就草草写了一下 代码如下&#xff1a; #include<stdio.h> #include<math.h> struct parking{int distance;int remain;int speed;int time;int jud; }parking[50]; …

2021年11月10日 Go生态洞察:Twelve Years of Go

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

前端:实现div的隐藏与显示

效果 完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

2021年12月14日 Go生态洞察:Go 1.18 Beta 1 发布与泛型的引入

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

C语言:求十个数中的平均数

分析&#xff1a; 程序中定义了一个average函数&#xff0c;用于计算分数的平均值。该函数接受一个包含10个分数的数组作为参数&#xff0c;并返回平均值。在主函数main中&#xff0c;首先提示输入10个分数&#xff0c;然后使用循环读取输入的分数&#xff0c;并将它们存储在名…

【BEV感知 LSS方案】Lift-Splat-Shoot(LSS)

前言 LSS全称是Lift-Splat-Shoot&#xff0c;它先从车辆周围的多个摄像头拍摄到的图像进行特征提取&#xff0c;在特征图中估计出每个点的深度&#xff0c;然后把这些点“提升”到3D空间中。 接着&#xff0c;这些3D信息被放置到一个网格上&#xff0c;最后将这些信息“拍扁”…

OSI七层模型与TCP/IP四层模型

一、OSI七层模型简述 OSI 模型的七层是什么&#xff1f;在 OSI 模型中如何进行通信&#xff1f;OSI 模型有哪些替代方案&#xff1f; TCP/IP 模型关于专有协议和模型的说明 二、七层模型详解&#xff08;DNS、CDN、OSI&#xff09; 状态码DNS nslookup命令 CDN whois命令 …

Java中的异常你了解多少?

目录 一.认识异常二.异常分类三.异常的分类1.编译时异常2.运行时异常 四.异常的处理1.LYBL&#xff1a;事前防御型2.EAFP&#xff1a;事后认错型 五.异常的抛出Throw注意事项 六.异常的捕获1.异常的捕获2.异常声明throws3.try-catch捕获并处理 七.自定义异常 一.认识异常 在Jav…

Python实现FA萤火虫优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

ChatGPT探索:提示工程详解—程序员效率提升必备技能【文末送书】

文章目录 一.人工智能-ChatGPT1.1 ChatGPT简介1.2 ChatGPT探索&#xff1a;提示工程详解1.2 提示工程的优势 二.提示工程探索2.1 提示工程实例&#xff1a;2.2 英语学习助手2.3 Active-Prompt思维链&#xff08;CoT&#xff09;方法2.4 提示工程总结 三.文末推荐与福利3.1《Cha…

这几款 idea 插件让效率起飞!

作者&#xff1a;苍何&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;CSDN 2023 年 实力新星&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#xf…

【CAD二次开发】标注箭头,获取修改标注箭头图块

常见的的标注箭头有以下种类 public static List<string> ArrowBlock = new List<string>(){" ","_CLOSEDBLANK&

如何选择靠谱的安防监控系统?优秀的安防智能系统应该具备哪些特点?

随着科技的不断进步&#xff0c;安防智能系统变得越来越重要。当前的安防监控市场系统五花八门&#xff0c;用户该如何选择性比价高、功能又靠谱的平台&#xff1f;一个优秀的安防智能系统应该具备哪些特点&#xff1f;今天我们来针对这个话题讨论和分享一下。 1、高效性&…

带你手搓阻塞队列——自定义实现

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是——阻塞队列的自定义实现&#xff0c;通过自定义实现一个阻塞队列&#xff0c;可以帮助我们更清晰、更透彻的理解阻塞队列的底层原理。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章…

Java全栈基础篇--集合

集合 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 特点&#xff1a; 长度不固定&#xff0c;还可以存储不同的数据&#xff08;但是一般都用同一类型&#xff09; 集合和数组既然都是容器&#xff0c;它们有啥区别呢&#xff1f; 数组的长…

EasyAmplicon (易扩增子)-扩增子高通量序列分析软件流程及脚本-详细使用方法——来自刘永鑫团队的秘籍

其他不重要&#xff0c;重要的是方向&#xff0c;资源&#xff0c;还要好用&#xff0c;建议大家先看看论文介绍&#xff1a; https://doi.org/10.1002/imt2.83EasyAmplicon: An easy‐to‐use, open‐source, reproducible, and community‐based pipeline for amplicon data…

软件测试-测试用例案例及思维导图展示

自动售货机的测试用例 一个杯子的测试用例 一支笔的测试用例 朋友圈点赞的测试用例 功能测试 1点赞后是否显示结果 2.点赞后是否可以取消; 3.点赞取消后是否可以重复点赞; 4.共同好友点赞后&#xff0c;是否有消息提醒; 5.非共同好友点赞后&#xff0c;是否有消息提醒; 6.点击…