DAY39 sed文本编辑器

194 阅读6分钟

文本三剑客:都是按行读取后处理。

  • grep 过滤行内容。
  • awk 过滤字段。
  • sed 过滤行内容;修改行内容。

1 sed编辑器

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

2 sed的工作流程

sed的工作流程主要包括读取、执行和显示三个过程:

  • 读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
  • 执行: 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  • 显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中。

3 sed命令格式

sed -e '操作' 文件1 文件2 

sed -n -e '操作' 文件1 文件2 

 sed -f 脚本文件 文件1 文件2  
 
 sed -i -e '操作' 文件1 文件2

执行多条命令的三种方法:

 sed -n -e '操作1' -e '操作2' 文件
 ​
 sed -n -e '操作1;操作2' 文件
 ​
 sed -e 'n{
 操作1
 操作2
 ......
 }' 文件1

常用选项:

选项作用
-e 或--expression=表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或--file=表示用指定的脚本文件来处理输入的文本文件
-h 或--help显示帮助
-n、--quiet或--silent禁止sed编辑器输出,但可以与p命令一起使用完成输出
-i直接修改目标文本文件
常用操作:
操作作用
s替换,替换指定字符
d删除,删除选定的行
a增加,在当前行下方增加一行指定内容
i插入,在选定行上方插入一行指定内容
c替换,将选定行替换为指定内容
y字符转换,转换前后的字符长度必须相同
p打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用
=打印行号
l (小写L)打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

sed的核心功能:增删改查(可配合正则表达式)

  查: p  
​  删: d  
​  改: s(字符串替换)、c(整行替换)、y(对应字符进行替换,效果类似tr命令) 
​  增: i(在行前插入内容)、a(在行后添加内容)、r(在行后读入文件的内容) 
​  复制粘贴:H(复制)、d(删除)、G(粘贴到指定行下方)

sed 查找打印p

不指定行(顺序处理每一行)

1、sed编辑器默认输出行内容,-n选项可以禁止输出。如果不加-n,却使用p操作,那么每行内容会打印两次。

sed -e "p" :每行内容打印两次。

sed -n "p" :每行内容只打印一次。

image.png

image.png

2、'n' 打印行号。

sed -n '=' :只打印行号。

sed -e 'n' : 打印行号和行内容。

sed -n '=;p' :打印行号和行内容。

image.png

sed 对指定行进行操作

两种方法:

  1. 以数字形式表示行区间;
  2. 用文本模式(字符串)来过滤出行(一般结合正则表达式)。 以数字形式表示行区间:
操作含义
'1p'打印第一行
'$p'打印最后一行
'1,3p'打印连续行,打印第一行到第三行
'6,$p'打印第六行到最后一行
'1,+3p'打印第一行加后面三行(即打印第一到第四行)
'5q'打印前五行后退出
'p;n'打印奇数行
'n;p'打印偶数行

使用字符串匹配出行:

操作含义
'/root/p'打印包含root的行
'/root/!p'打印不包含root的行。! 表示取反
'/^root/p'打印以root开头的行
'/bash$/'打印以bash结尾的行
'/root l bash/p'打印包含root或bash的行。"l"是扩展正则表达式的元字符,要使用sed -r
'6,/root/p'打印第6行到第一个包含root的行

 以数字形式表示行区间

1、打印单行。 image.png 2、打印连续的行,使用逗号。

image.png 3、'1,+3p',打印第1行加后面3行(即打印第1~4行)!

image.png 4、打印第1~5行的三种方法:

image.png

5、使用sed输出奇数行或者偶数行。

image.png

6、打印除了第一行以外的奇数行。

image.png

使用正则表达式,匹配行内容

注意:sed 使用扩展正则表达式时,要加 -r 。

示例1:

image.png

示例2:

image.png 示例3:

sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。

image.png

image.png

sed 删除d

示例1:

以数字形式表示行区间。

image.png

image.png

image.png

示例2:

通过字符串匹配出想要的行。

image.png

示例3:

image.png

示例4:

image.png

删除空行的三种方法:

  1. grep -v "^$" file.txt //过滤出非空行
  2. cat file.txt |tr -s "\n" //压缩换行符
  3. sed '/^$/d' file.txt //删除空行

sed 修改替换s c y

s:替换字符串

c:整行替换

y:字符替换,替换前后的字符串长度必须相同

替换字符串 s

格式:

 行范围 s/旧字符串/新字符串/替换标记
 ​
 #4种替换标记:
 数字:表明新字符串将替换第几处匹配的地方
 g:表面新字符串将会替换所有匹配的地方
 p:打印与替换命令匹配的行,与-n一起使用
 w 文件:将替换的结果写入文件中

示例1:

image.png

示例2:

image.png

示例3:

将root开头的行进行注释(在开头加上#);

在包含root的行的行尾加上#

image.png

示例5:-f 指定脚本文件来执行

可以在文件中定义多条操作规则。

image.png 示例6:将修改后的内容保存到另一个文件中

1)重定向全文本(将修改后的行内容和原文其他内容一起保存)

image.png

只重定向修改内容 image.png

示例7:指定分隔符

当字符串中包含"/"时,需要在前面加上转义符\,避免和分隔符"/"混淆。这样操作非常麻烦,且容易眼花看错,此时可以自己指定分隔符。

s后面的第一个字符就是分隔符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符需要使用 \ 转义成普通字符。

image.png

sed 's9\945\9\99\98\939g' test.txt //这行命令的作用是什么?

 相当于s/94599/9893/g,指定了9作分隔符,那么普通的数字9前面要加\。即将94599替换成9893

整行替换 c

使用c进行替换,是对整行内容进行替换。

示例:

将包含字符串fo的行,整体替换成22。

image.png

 单字符替换 y

使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换。前后字符串长度需要一致,不然会报错。

示例:

遇到n替换成2,遇到o替换成5。

image.png

sed 增加a i r

a:在行后添加内容

i:在行前插入内容

r:在行后读入文件内容

在行后添加内容a

示例1:在第一行下方添加一行内容

image.png 示例2:在第1~3行,每行下方添加一行内容

image.png

示例3:在最后一行的下方,添加一行内容

image.png 示例4:在第一行下方添加3行内容

image.png

在行前插入内容 i

image.png

 在行后读入文件内容 r

image.png

sed 复制粘贴

#sed命令:  H复制、d删除、G粘贴到指定行下方

示例1:剪切粘贴

image.png

示例2:复制粘贴

image.png

文件内容中的字符串进行互换

示例1:

image.png

示例2:

将abc123修改成123abc、321cba。

image.png

image.png