Linux shell编程学习笔记74:sed命令——沧海横流任我行(中)

2024-08-21 22:44

本文主要是介绍Linux shell编程学习笔记74:sed命令——沧海横流任我行(中),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0 前言

自 60 年代末以来,sed 一直是 Unix 标准工具箱的一部分。

 Sed在以下三种情况下特别有用:

  1. 编辑太大的文件,无法进行舒适的交互式编辑;

  2. 当编辑命令序列过于复杂而无法在交互模式下轻松键入时,可以编辑任何大小的文件。

  3. 通过输入一次有效地执行多个“全局”编辑功能。

 在

Linux shell编程学习笔记73:sed命令——沧海横流任我行(上)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/141307421?spm=1001.2014.3001.5501

中我们研究了sed了基础知识,现在我们来通过一些实例来见识一下sed删除和替换功能的威力。

1 sed实列

1.1 删除指定行

删除操作使用d命令。

我通过sed对seq命令产生的序列来说明。 

关于seq命令的功能和用法,可以参考:Linux shell编程学习笔记35:seq_linux shell seq-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/134938053

1.1.1 删除第3行

[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed 3d
1
2
4
5
6
7
[purpleendurer @ bash ~ ] 

 seq 7 命令执行的结果是产生7行数据,分别是1、2、3、4、5、6、7。

我们把 seq 7 命令执行的结果通过管道传送给命令sed 3d来处理,其中:

3:指定第3行。

d:指定执行删除操作。

 于是我们看到处理的结果中,没有第3行。

1.1.2 删除3~5行

我们可以使用 

起始行号,结束行号

来指定一个要处理的连续的行块。 

要指定对第3行~第5行进行操作,我们可以通过  3,5 来指定。

[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed 3,5d
1
2
6
7
[purpleendurer @ bash ~ ] 

 于是我们看到处理的结果中,没有第3行~第5行。

1.1.3 删除奇数行

我们可以通过

起始行~步长

的格式来指定要处理的行。

对于奇数行,起步行为1,步长为2,所以我们可以使用 1~2 来指定奇数行。

[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed 1~2d
2
4
6
[purpleendurer @ bash ~ ] 

 1.1.4 删除第3行及其后3行

我们也可以可以通过

起始行,+行数

的格式来指定要处理的行,例如我人们要对第3行及其后3行进行处理,那么可以使用 3,+3 来指定。

[purpleendurer @ bash ~ ] seq 8
1
2
3
4
5
6
7
8
[purpleendurer @ bash ~ ] seq 8 | sed 3,+3d
1
2
7
8
[purpleendurer @ bash ~ ] 

 1.1.5 直接删除纯数字行

我们可以使用正则表达式来指定要处理的行,比如直接删除纯数字行。

[purpleendurer @ bash ~ ] cat t.txt
0
aaa
***
11
bbb
222
+++
222abc
[purpleendurer @ bash ~ ] sed  '/^[0-9]*$/d' t.txt
aaa
***
bbb
+++
222abc
[purpleendurer @ bash ~ ] 

 

 我们先使用 cat t.txt  命令查看文件t.txt的内容,其第1、4、6行都是纯数字的。

然后我们使用 sed '/^[0-9]*$/d' t.txt 命令将文件t.txt中的纯数字行删除后再输出。

可以看到第1、4、6这由纯数字的3行均被删除了。

而最后一行即第8行,虽然开头是数字222,但后面还字母aaa,不是纯数字行,所以没有被删除。

对命令的第2部分 '/^[0-9]*$/d作个说明。:

  1. /^[0-9]*$/^代表行开始,$代表行结束,二者之间 的 [0-9]* 代表数字,三者放在一起就代表纯数字行。
  2. d:代表删除命令

 1.2 文本替换

替换操作使用d命令。

整行替换的格式一般为:

sed '[指定操作行]s 替换字符串/' [文件]

如果使用了正则表达式指定要替换的字符串,也就是要进行精准替换,可以用下面这种格式:

sed 's/原字符串/替换字符串/' [文件]

1.2.1 将第3行内容替换为abc

[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed  '3c abc'
1
2
abc
4
5
6
7
[purpleendurer @ bash ~ ] 

1.2.2 将偶数行替换为abc

对于奇数行,起步行为0,步长为2,所以我们可以使用 0~2 来指定偶数行。

[purpleendurer @ bash ~ ] seq 7
1
2
3
4
5
6
7
[purpleendurer @ bash ~ ] seq 7 | sed '0~2c abc'
1
abc
3
abc
5
abc
7
[purpleendurer @ bash ~ ] 

 

1.2.3 将每行中的 数字 替换为 -

[purpleendurer @ bash ~ ] echo "0" > t.txt
[purpleendurer @ bash ~ ] echo "aaa" >> t.txt
[purpleendurer @ bash ~ ] echo "***" >> t.txt
[purpleendurer @ bash ~ ] echo "11" >> t.txt
[purpleendurer @ bash ~ ] echo "bbb" >> t.txt
[purpleendurer @ bash ~ ] echo "222" >> t.txt
[purpleendurer @ bash ~ ] echo "+++" >> t.txt
[purpleendurer @ bash ~ ] cat t.txt
0
aaa
***
11
bbb
222
+++
[purpleendurer @ bash ~ ] sed 's/[0-9]/-/g' t.txt
-
aaa
***
--
bbb
---
+++
[purpleendurer @ bash ~ ] 

 

我们先使用echo命令和重定向创建测试文件.txt

然后用cat t.txt  命令查看文件t.txt的内容

最后我们使用 sed 's/[0-9]/-/g' t.txt 命令将文件t.txt中的每行中的 数字 替换为 -再输出。

对命令的第2部分 s/[0-9]*/-/g 作个说明。

  1. s:替换命令
  2. /[0-9]*/:正则表达式,代表数字0,1,2,3,4,5,6,7,8,9
  3. -:要替换的字符串
  4. /g:全局作用域

 1.2.4 将数字替换为空,再删除空行

[purpleendurer @ bash ~ ] cat t.txt
0
aaa
***
11
bbb
222
+++
[purpleendurer @ bash ~ ] sed 's/[0-9]*//g' t.txtaaa
***bbb+++
[purpleendurer @ bash ~ ] sed -e 's/[0-9]*//g; /^$/d' t.txt
aaa
***
bbb
+++
[purpleendurer @ bash ~ ] 

我们先使用 cat t.txt  命令查看文件t.txt的内容,其第1、4、6行都是纯数字的。

然后我们使用 sed 's/[0-9]*//g' t.txt 命令将文件t.txt中的每行中的 数字 替换为空再输出。

对命令的第2部分 s/[0-9]*//g 作个说明。

  1. s:替换命令
  2. /[0-9]*/:正则表达式,代表数字0,1,2,3,4,5,6,7,8,9
  3. /g:全局作用域

这里没有指定要替换的目标字符串,也就是替换为空。

最后我们使用  sed -e 's/[0-9]*//g; /^$/d' t.txt 命令将文件t.txt中的每行中的 数字 将数字替换为空,再删除空行。

对命令的第3部分 's/[0-9]*//g; /^$/d作个说明。

这个部分由分号分为前后两个命令。

前一个命令  s/[0-9]*//g 在上面已经说明。

后一个命令 /^$/包括两个部分:

  1.  /^$/:^代表行开始,$代表行结束,两个符号放在一起,中间没有其他这字符,就代表空行
  2. d:代表删除命令

1.2.5 将每行第3次出现的2替换为5

[purpleendurer @ bash ~ ] cat -n t.txt1  02  aaa3  ***4  115  bbb6  2227  +++8  222abc
[purpleendurer @ bash ~ ] cat -n t.txt | sed 's/2/5/3' 1  02  aaa3  ***4  115  bbb6  2257  +++8  225abc
[purpleendurer @ bash ~ ] 

 

 我们先使用 cat t.txt  命令查看文件t.txt的内容,其第6、8行都包括3个2。

然后我们使用 cat -n t.txt | sed 's/2/5/3' 命令将文件t.txt中每行第3次出现的2替换为5后再输出。

可以看到第6、8行中的第3个2被替换为5了。

对sed命令后面的 's/2/5/3作个说明。:

  1. s:替换命令
  2. /2/5/3:其中2是被替换的原字符串,5是被替换的目标字符串,3代表第3次出现。

1.2.6 将每行中第2次出现的a替换为A

[purpleendurer @ bash ~ ] cat -n t.txt1  02  aaa3  ***4  115  bbb6  2227  +++8  222abc
[purpleendurer @ bash ~ ] cat -n t.txt | sed -e 's/a/A/2'1  02  aAa3  ***4  115  bbb6  2227  +++8  222abc
[purpleendurer @ bash ~ ] 

我们先使用 cat t.txt  命令查看文件t.txt的内容,其中第2行中有3个a。

然后我们使用 cat -n t.txt | sed 's/2/5/3' 命令将文件t.txt中每行中的第2次出现的a替换为A再输出。

可以看到第2行中的第2个a被替换为A了。

这篇关于Linux shell编程学习笔记74:sed命令——沧海横流任我行(中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094497

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin