当前位置: 首页 > news >正文

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.lryc.cn/news/250009.html

相关文章:

  • NDK是什么?有什么用?需要掌握什么技术栈?
  • 《代码长寿经:程序员养生指南》
  • 统计素数并求和(Python)
  • 新建的springboot项目中application.xml没有绿色小叶子(不可用)
  • powershell获取微软o365 21v日志
  • 整体迁移SVN仓库到新的windows服务器
  • D365 CRM Power Platform 后端开发概览
  • 【Java 并发编程】进程线程、lock、设计模式、线程池...
  • 【axios】拦截器:axios.interceptors.request.use|axios.interceptors.response.use
  • webrtc兼容android4.x的一次探索
  • Kafka的存储机制和可靠性
  • 数据库时间类型之间的转换魔法
  • conda和pip常用命令整理
  • 英语翻译小软件 ← Python实现
  • 将项目放到gitee上
  • 【机器视觉技术】:开创人工智能新时代
  • 网易区块链,网易区块链赋能赣州脐橙数字藏品,数字指纹解决方案
  • 程序员如何兼职?
  • 教育企业CRM选择技巧
  • 算法:Java计算二叉树从根节点到叶子结点的最大路径和
  • 袖珍可穿戴手持气象仪是什么?
  • 【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建
  • 无需繁琐编程 开启高效数据分析之旅!
  • JOSEF约瑟 剩余电流保护器 CLJ3-100A+LH30 导轨安装
  • vue3自定义指令-文本超出宽度滚动
  • uniapp在H5端实现PDF和视频的上传、预览、下载
  • Kafka报错under-replicated partitions
  • 【Python基础】字符集与字符编码
  • C# AES-128-CBC 加密
  • 【惊喜福利】Docker容器化部署nextcloud网盘,享受高速稳定的文件共享体验!