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

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了。

http://www.lryc.cn/news/429562.html

相关文章:

  • [数据集][目标检测]道路积水检测数据集VOC+YOLO格式2699张1类别
  • 不同路径
  • 【HTML】HTML学习之引入CSS样式表
  • shaushaushau1
  • 揭秘面试必备:高频算法与面试题全面解析
  • 设计模式-visit模式-在语法树的实践
  • ZK-Rollups测评
  • redis生产使用场景(一):并行流+二级缓存
  • EXCEL跨文件查询,指定条件列,返回满足条件的指定列
  • [数据集][目标检测]流水线物件检测数据集VOC+YOLO格式9255张26类别
  • StarRocks 存算分离 Compaction 原理
  • 搭建ELK日志采集与分析系统
  • java集合中自动排序的treeset和treemap
  • Android 修改SystemUI 音量条的声音进度条样式
  • 电商场景的视频生成的prompt测评集合
  • day34
  • 无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案
  • AWS服务WAF
  • 二叉树中的奇偶树问题
  • GD - EmbeddedBuilder - 用DMA进行串口发送接收,支持接收不定长包
  • 英语中apartment(公寓)(美式)、house(房子)、flat(公寓)(英式)、villa(别墅)、room(房间)区别
  • 黑马头条vue2.0项目实战(十一)——功能优化(组件缓存、响应拦截器、路由跳转与权限管理)
  • 《AI视频类工具之一——​ 即创》
  • CSS的:host伪类:精确定位于Web组件的指南
  • 安卓sdk manager下载安装
  • CV学习笔记3-图像特征提取
  • Git使用方法(三)---简洁版上传git代码
  • 8.21-部署eleme项目
  • 多目标跟踪之ByteTrack论文(翻译+精读)
  • 【实践】Java开发常用工具类或中间件