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
注意:
- 这里的替换并不会回写到源文件中,sed将an替换为AN之后,默认写入输出流里了,如果没有后续处理那么就会直接打印到终端。
删除文本
删除文本的子命令是d
,可以删除我们不需要的行,示例如下:
- 删除fruit文件第一行:
sed 1d fruit
结果如下
2. 删除带关键字‘an’的行,这里使用正则定位然后删除
sed /an/d fruit.txt
结果如下,banana和orange都被删除了
新增文本
新增文本行的子命令有两个a
和 i
,其中 a
代表在指定位置的后面追加(append),i
代表在指定位置前插入(insert)。示例如下:
- 我们在fruit.txt文件第二行后面追加一行grape, 如下;
sed '2 a grape' fruit.txt
结果如下:
- 在最后一行的前面插入cherry ,如下:
sed '$ i cherry' fruit.txt
结果如下:
注意:
- sed对文本的修改都不会回写到原文件里,而是写入到了输出流,默认就是终端,所以sed命令并不会破坏原来的文件
结语
sed命令其实还有很多用法这里都没有列出来,只是挑了一些博主认为常用的功能介绍,如果感兴趣可以通过 man sed
命令,查询最全的使用说明。
相关文章:

shell编程系列(8)-使用sed处理文本
文章目录 引言sed用法详解在文本中定位打印文本替换文本删除文本新增文本 结语 引言 在日常工作学习中我们都会遇到要编辑文本的场景,例如我们要用vim或者nano等命令去编辑代码,处理文本文件等,这些命令的特点都是需要我们进行交互式的实时处…...

NDK是什么?有什么用?需要掌握什么技术栈?
文章目录 NDK使用NDK的优点使用NDK需要掌握的知识C/C的编译原理C/C基本语法和编写能力原生共享库:原生静态库:Java 原生接口 (JNI):应用二进制接口 (ABI): CMakeLLDB参考 NDK NDK(Native Development Kit,…...

《代码长寿经:程序员养生指南》
嘿,代码海洋的航行者们!你们是否有过熬夜加班后,头发渐渐稀疏、眼镜度数直线上升,还不小心多了几斤“编码赘肉”的经历?程序员这个行业,似乎人均亚健康,有人戏称程序员的职业发展路径是…...

统计素数并求和(Python)
题目描述 统计素数并求和 本题要求统计给定整数 M M M 和 N N N 区间内素数的个数并对它们求和。 输入格式: 输入在一行中给出两个正整数 M M M 和 N ( 1 ≤ M ≤ N ≤ 500 ) N(1≤M≤N≤500) N(1≤M≤N≤500)。 输出格式: 在一行中顺序输出 M M M 和 N N N 区间内…...

新建的springboot项目中application.xml没有绿色小叶子(不可用)
经常有朋友会遇到新建了一个springboot项目,发现为啥我创建的application.xml配置文件不是绿色的??? 下面教大家如何解决,这也是博主在做测试的时候遇到的: 将当前位置application.xml删掉,重新…...

powershell获取微软o365 21v日志
0x00 背景 o365 21v为o365的大陆版本,主要给国内用户使用。微软提供了powershell工具和接口获取云上日志。微软o365国内的代理目前是世纪互联。本文介绍如何用powershell和配置证书拉取云上日志。 0x01 实践 第一步,ip权限开通: 由世纪互联…...

整体迁移SVN仓库到新的windows服务器
一、背景 公司原有的SVN服务器年代比较久远经常出现重启情况,需要把SVN仓库重新迁移到新的服务器上,在网上也搜到过拷贝Repositories文件直接在新服务器覆盖的迁移方案,但考虑到原有的操作系统和现有的操作系统版本不一致,SVN版本…...

D365 CRM Power Platform 后端开发概览
博主十年前写的后端技术文章大部分都out-of-date啦,有些东西还能在PP系统中继续沿用,大部分东西都变成old fashion了。 博主后续争取多找些时间,将之前的后端开发文档都翻新一遍,争取与时俱进,让它们还能继续使用下个…...

【Java 并发编程】进程线程、lock、设计模式、线程池...
博主:_LJaXi Or 東方幻想郷 专栏: Java | 从入门到入坟 Java 并发编程 并发编程多线程的入门类和接口线程组和线程优先级线程的状态及主要转化方法线程间的通信重排序和 happens-beforevolatilesynchronized 与锁CAS 与原子操作AQS计划任务Stream 并行计…...

【axios】拦截器:axios.interceptors.request.use|axios.interceptors.response.use
文章目录 概述设置拦截器Axios 拦截器的实现任务注册任务编排任务调度 来源 概述 axios有请求拦截器(request)、响应拦截器(response)、axios自定义回调处理(这里就是我们常用的地方,会将成功和失败的回调…...

webrtc兼容android4.x的一次探索
背景是我们有一个四年前的应用,该应用TargetVersion设定为16,这个应用四年前用了m70版本的webrtc。最近我升级到webrtc-m110,发现各种崩溃,把崩溃修好之后,发现黑屏了。为了处理黑屏,故有本文。 黑屏问题表…...

Kafka的存储机制和可靠性
文章目录 前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储 五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5.1.…...

数据库时间类型之间的转换魔法
解锁时间数据的魔法 时间,是数据库中一个充满魔法的复杂表现形式。在这篇博客中,我们将探讨在数据库中时间戳(timestamp)、日期(date)、日期时间(datetime)和字符串之间的转换技巧&…...

conda和pip常用命令整理
文章目录 一、conda常用指令1. 更新2 .环境管理3. 包管理 二、pip常用命令1. 常用命令2. 国内镜像 一、conda常用指令 1. 更新 conda --version 或 conda -V #查看conda版本 conda update conda # 基本升级 conda update anaconda # 大的升级 conda upd…...

英语翻译小软件 ← Python实现
【程序描述】 利用Python实现一个英语翻译小软件。 ★ 当输入一个英文单词后,输出对应的中文意思。 ★ 当输入 q 时,退出程序。 ★ 当输入一个不存在的词条时,捕获异常,提示“No finding!”。【程序代码】 dict{&quo…...

将项目放到gitee上
参考 将IDEA中的项目上传到Gitee仓库中_哔哩哔哩_bilibili 如果cmd运行ssh不行的话,要换成git bash 如果初始化后的命令用不了,直接用idea项放右键,用git工具操作...

【机器视觉技术】:开创人工智能新时代
🎥 屿小夏 : 个人主页 🔥个人专栏 : IT杂谈 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑 前言🌤️ 机器视觉技术的实现☁️ 图像采集☁️ 图像处理☁️ 数据建模☁️应用展示…...

网易区块链,网易区块链赋能赣州脐橙数字藏品,数字指纹解决方案
目录 网易区块链 网易区块链赋能赣州脐橙数字藏品,助力革命老区三农之路 数字指纹解决方案 网易区块链 网易区块链成立于2017年,致力于Web3.0区块链技术的研发和应用。自主研发的区块链“天玄”引擎,在单链场景下支持每秒最高30万笔交易,单日可处理上链数据超10亿。 与…...

程序员如何兼职?
首先,写博客和制作短视频是一个好方法。想象一下,你是一个资深的程序员,而你的博客就像是一个个人课堂,帮助那些初入编程领域的人理解各种编程概念和技巧。你可以分享你的工作经验、解决问题的过程,甚至可以分享一些有…...

教育企业CRM选择技巧
教育行业的发展一波三折,要想在激烈的赛道脱颖而出,就需要有一套有效的CRM系统,来帮助教育机构提升招生效率、增加学员留存、提高教学质量。下面说说,教育企业选择CRM系统要具备的四大功能。 1、招生管理功能 教育机构的首要目标…...

算法:Java计算二叉树从根节点到叶子结点的最大路径和
要求从根节点到叶子结点的最大路径和,可以通过递归遍历二叉树来实现。对于二叉树中的每个节点,我们都可以考虑包含该节点的最大路径和。在递归的过程中,我们需要不断更新全局最大路径和。 具体的思路 递归函数设计: 设计一个递归函…...

袖珍可穿戴手持气象仪是什么?
随着科技的不断发展,我们身边的世界正在变得越来越智能化。近日,一款名为WX-SQ12可穿戴手持气象仪的科技新品引起了人们的广泛关注。这款气象仪不仅具有创新性的可穿戴设计,还具备强大的气象数据监测功能,让用户可以随时掌握天气变…...

【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 前言 Databricks 已经成为了数据科学的必备工具,今时今日你已经很难抛开它来谈大数据,它常用于做复杂的ETL中的T, 数据分析,数据挖掘等,…...

无需繁琐编程 开启高效数据分析之旅!
不学编程做R统计分析:图形界面R Commander官方手册 R Commander是 R 的图形用户界面,不需要键入命令就可通过熟悉的菜单和对话框来访问 R 统计软件。 R 和 R Commander 均可免费安装于所有常见的操作系统——Windows、Mac OS X 和 Linux/UNIX。 本书作…...

JOSEF约瑟 剩余电流保护器 CLJ3-100A+LH30 导轨安装
CLJ3系列剩余电流动作继电器 系列型号: CLJ3-100A剩余电流动作继电器 CLJ3-250A剩余电流动作继电器 CLJ3-400A剩余电流动作继电器 CLJ3-630A剩余电流动作继电器 LH30剩余电流互感器 LH80剩余电流互感器 LH100剩余电流互感器 LH140剩余电流互感器 一、产品概…...

vue3自定义指令-文本超出宽度滚动
fontScroll.ts 指令文件 import { Directive } from vuefunction randomInt(min, max) {return Math.floor(Math.random() * (max - min 1)) min; } export default {// 可控制滚动速度,默认滚动速度20px/s,最低动画时长2smounted: (el, binding, vNode): void &…...

uniapp在H5端实现PDF和视频的上传、预览、下载
上传 上传页面 <u-form-item :label"(form.ququ3 1 ? 参培 : form.ququ3 2 ? 授课 : ) 证明材料" prop"ququ6" required><u-button click"upload" slot"right" type"primary" icon"arrow-upward" t…...

Kafka报错under-replicated partitions
1 under-replicated partitions异常原因 Kafka报错under replicated partitions意味着某些分区的副本数量未达到预期的复制因子。 主要有两种原因, Broker故障 如果某个Kafka Broker发生故障,导致其中一些分区的副本不再可用,那么这些分区就…...

【Python基础】字符集与字符编码
先行了解的知识: 1. 编码和解码 计算机内存储的信息都是二进制表示。 我们看到的英文,数字,汉字等在计算机内如何表示,那就需要编码 计算机内存储的信息需要解析出来,那就是解码 2.字符集与分类 什么是字符集…...

C# AES-128-CBC 加密
一、加密 /// <summary>/// 加密/// </summary>public static string AesEncrypt(string toEncrypt){byte[] toEncryptArray UTF8Encoding.UTF8.GetBytes(toEncrypt);byte[] keyArray UTF8Encoding.UTF8.GetBytes(Key);//注意编码格式(utf8编码 UTF8Encoding)byt…...