0


Linux- 系统随你玩之--文本处理三剑客--grep继任者sed

文章目录

1、sed概述

sed 全名为 stream editor,流编辑器,是贝尔实验室的 Lee E.McMahon 在 1973 年到 1974 年之间开发完成,目前可以在大多数操作系统中使用,sed 的出现作为 grep 的继任者。

1.1、 与vim等编辑器的区别:

  • vim 文本编辑器: 编辑对象是文件;
  • sed 行编辑器:编辑对象是文件中的行;

sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。

1.2、sed工作原理

sed 本身一次处理一行内容。

  1. 处理的时候会把当前处理的行内容存储在临时缓冲区中,成为"模式空间",
  2. 接着用sed命令处理缓冲区中的内容,处理完成后,会把缓冲区的内容输出到屏幕。
  3. 接着处理下一行内容,如此不断重复此过程,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

1.3 、sed数据处理原理

在这里插入图片描述

1.4 、正则表达式概念

使用sed 主要就是使用正则模式进行匹配,所以需要了解正则表达式相关内容。

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式 我会单独写一篇内容讲解,此外就不在介绍。

2、 sed语法和常用选项

2.1、语法:

调用sed命令有两种形式:
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)

sed[options] ‘{command}[flags]’ [filename]#中括号内容必有 大括号内容可有可无sed# 执行命令[options]# 命令选项{command}[flags]# sed内部选项和参数[filename]# 文件
命令选项
-e script 将脚本中指定的命令添加到处理输入时执行的命令中  多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n        抑制自动输出
-i        编辑文件内容
-i.bak    修改时同时创建.bak备份文件。
-r        使用扩展的正则表达式
!         取反 (跟在模式条件后与shell有所区别)

2.2、sed常用内部命令

a :  在匹配行后添加一行或多行内容
c : 用新文件修改(替换)当前行中的文本
d : 删除
g : 全局执行
i :  在匹配的行之前插入文本
p   打印
r : 从以外文件中读相关内容,写到相关行之后
s : 用一个字符替整体替换成另外一个字符(查找替换)
w : 匹配到的行写入一个新的文件之中
y : 将字符转换成一个新的字符
i : 与s指令配合一起使用时,则是忽略大小写的作用

flags
数字             表示新文本替换的模式
g:             表示用新文本替换现有文本的全部实例
p:             表示打印原始的内容
w filename:     将替换的结果写入文件

2.3、参数:

  • e : 允许多项编辑
  • n : 取消默认输出
  • i : 就地编辑文本
  • r : 支持扩展正则表达式(sed中的正则表达式必须放在两个//中间)
  • f : 指定定位规则的文件

3、 sed + 正则表达式(定位)

3.1 、数字定址

默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-5行,偶数行,或者是包含"word"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"。
数字定址其实就是通过数字去指定具体要操作编辑的行,

数字定址有多种方式,每种方式都有不同的应用场景,下边以举例的方式来描述每种数字定址的用法。
固定定位
[root@localhost ~]# sed -n ‘3p’ 1.txt
范围定位
[root@localhost ~]# sed -n ‘1,3p’ 1.txt

3.2、常用实例

3.2.1、指定行 字符串** 内容替换

sed –n '1s/word/china/' message

命令说明:将第1行中word字符串替换为china,其它行如果有word也不会被替换。

3.2.2、限定区间行数 字符串内容替换

sed –n '3,5s/word/china/' message

命令说明:将第3-5行中word字符串替换为china,其它行如果有word也不会被替换。

3.2.3、指定区间行 字符串内容替换

sed –n ‘1,+4s/word/china/’ message
命令说明:从第1行开始,再接着往下数4行,也就是1-5行,这些行会把word字符串替换为china。

3.2.4、指定起始行及倍数行 字符串内容替换

sed –n '4,~3s/word/china/' message

命令说明:第4行开始,到第6行。解释6的由来,"4,~3"表示从4行开始到下一个3的倍数,这里从4开始算,那就是6了,当然9就不是了,因为是要求3的第一个超过前边数字4的倍数,这种适用场景不会太多。

3.2.5、指定起始行及跨行规则 字符串内容替换

sed –n '4~3s/word/china/' message

命令说明:从第4行开始,每隔3行就把hello替换为A。比如从4行开始,7行,10行等依次+3行。这个比较常用,比如3替换为2的时候,也就是每隔2行的步调,可以实现奇数和偶数行的操作。

3.2.6、指定起始行及跨行规则 字符串内容替换

sed –n '$s/word/china/' message

命令说明:

    符号表示最后一行,和正则中的
   
  
  
   符号表示最后一行,和正则中的
  
 
符号表示最后一行,和正则中的符号类似,但是第1行不用^表示,直接1就行了。

3.2.7、指定起始行及跨行规则 字符串内容替换

sed-n'1!s/word/china/' message

命令说明:!符号表示取反,该命令是将除了第1行,其它行word替换为china,上述定址方式也可以使用!符号。

3.3、正则表达式

3.3.1、解释

正则表达式必须放在/ / 之间

数字加数字
数字加正则
正则加数字
正则加正则

\c与c分隔符
\c与c只是一个代表,其中c可以换成任意一个字符

说明:正则匹配是非贪婪性的匹配

  • 贪婪性:是匹配到了之后,不停继续匹配,直至文件所有的内容全部匹配完毕。
  • 非贪婪性:是匹配,一旦匹配到了就停止匹配。

3.3.2、操作实例

正则定址使用目的和数字定址一样,只是它们在使用方式上有所不同,是通过正则表达式的匹配来确定需要处理编辑哪些行,其它行就不需要额外处理。

1、匹配到删除

sed-n'/word/d' message

说明:将匹配到word的行执行删除操作。
例子2:
2、删除空行

sed-n'/^$/d' message

3、匹配区间行进行删除

sed-n'/^THE/,/^COME/d' message

说明:匹配以THE开头的行到COME开头的行之间的行,把匹配到的这些行删除。
4、数字定址和正则定址混用

在实际使用过程中我们经常将数字定址和正则定址可以配合使用,参考下边的例子。

sed-n'1,/^THE/d' message

说明:匹配从第1行到THE开头的行,把匹配的行删除。

4、sed使用技巧

4.1 、$= 统计文本有多少行

  1. 统计fyydlz.txt有多少行;
  2. 打印fyydlz.txt 文本内容时加上行号;
sed-n'$=' fyydlz.txt
sed'=' fyydlz.txt

在这里插入图片描述

4.2 、行内容迁移

将1-5行迁移到10行后

sed'1,5{H;d};10G' fyydlz.txt

4.3、 将匹配的内容另存为新文件

sed'/the/w fyydlz.txt' fyydlz2.txt

5、练习实操

5.1、实操题目

本次实操题目内容:
假设文件fyydlz.txt的文本如下(可以利用touch命令和vi命令组合创建):

1. hello fyydlz world
2. wold hello hello
3. nothing is important fyydlz 
4. i like movie movie fyydlz 

sed 命令可以用来替换文本行、删除文本行,例子如下:

5.2、 基于题目练习例子

1、查找并替换每行第一个"hello"为"你好":

sed's/hello/你好/' fyydlz.txt

在这里插入图片描述

2、查找替换每行中所有的"hello"为"你好":

sed's/hello/你好/g' fyydlz.txt

在这里插入图片描述

3、删除含有"hello"的行:

sed'/hello/d' fyydlz.txt

在这里插入图片描述

4、删除第2行:

sed'2d' fyydlz.txt

在这里插入图片描述

5、删除第最后一行:

sed'd' fyydlz.txt

在这里插入图片描述
6、删除第2行到最后一行:

sed'2,d' fyydlz.txt

本文转载自: https://blog.csdn.net/fyydlz/article/details/128774617
版权归原作者 风一样的美狼子 所有, 如有侵权,请联系我们删除。

“Linux- 系统随你玩之--文本处理三剑客--grep继任者sed”的评论:

还没有评论