Shell(三):Sed命令

发布时间 2023-10-12 20:00:08作者: 无虑的小猪

  sed是Linux系统中的文本处理工具,sed是流编辑器,是 stream editor 的简写,将一系列编辑命令作用于一批文件的理想工具。

1、Sed命令基本用法

1.1、sed命令的作用

  sed是一个非交互式文本编辑器,可对文本文件和标准输入进行编辑,标准输入可以是来自键盘输入、文件重定向、字符串、变量,来自管道的文本。

  sed从文本的一个文本行或标准输入中读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此命令要求的行号进行编辑,重复此过程,直到命令或脚本中的所有命令都执行完毕。

1.2、sed适用的场合

sed可以一次性处理所有的编辑任务,节省大量的事件,sed适用于以下三种场合:

  ·编辑相对交互式文本编辑器而言太大的文件;

  ·编辑命令太复杂,在交互式文本编辑器中难以输入的情况;

  ·对文件扫描一遍,但需要执行多个编辑函数的情况。

  sed只是对缓冲区中原始文件的副本进行编辑,并不编辑原始文件。若需要保存改动内容,需要将输出重定向到另一个文件,可以使用下面格式的命令:

sed 'sed命令' input-file > result-file

  该命令将sed命令对input-file的更改保存到result-file中,">"符号是重定向符号。

1.3、调用sed的三种方式

  调用sed有三种方式,一种为Shell命令行方式,另外两种是将sed命令写入脚本文件,然后执行该脚本文件。

1.3.1、Shell命令行方式

sed [option] 'sed命令' 输入文件

  需要用单引号将sed命令引起来。

1.3.2、将sed命令插入脚本文件后,然后通过sed命令调用它

sed [option] -f sed脚本文件 输入文件

1.3.3、将sed命令插入脚本文件后,设置该脚本文件为可执行,然后直接执行该脚本文件

./sed脚本文件 输入文件

  第三种方式的sed脚本与第二种不同,其sed脚本文件需要以sha-bang(#!)符号开头,sha-bang后面是解析这个脚本的程序名。若没有指定输入文件,sed将从标准输入中接受输入。

  sed的常用选项有三个:

选项

含义

-n

不打印所有行到标准输出

-e

表示将下一个字符串解析为sed编辑命令。若只传递一个编辑命令给sed,-e选项可省略

-f

表示正在调用sed脚本文件

  sed命令通常由 定位文本行 和 sed编辑命令 两部分组成,sed编辑命令对定位文本行进行各种处理,sed提供以下两种方式定位文本:

    ·使用行号,指定一行,或指定行号范围。

    ·使用正则表达式

  sed命令定位文本的方法:

选项

含义

x

x为指定行号

x,y

指定从x到y的行号范围

/pattern/

查询包含模式的行

/pattern/pattern/

查询包含两个模式的行

/pattern/,x

从与pattern的匹配行到x号行之间的行

x,/pattern/

从x号行到与pattern的匹配行之间的行

x,y!

查询不包括x和y行号的行

  sed编辑命令表示对文本进行如何处理,如打印、删除、追加、插入、替换等,sed提供丰富的编辑命令,详情如下:

选项

含义

p

打印匹配行

=

打印文件行号

a\

在定位行号之后追加文本信息

i\

在定位行号之前插入文本信息

d

删除定位行

c\

用新文本替换定位文本

s

使用替换模式替换相应模式

r

从另一个文件中读文本

w

将文本写入到一个文件

y

变换字符

q

第一个模式匹配完成后退出

{}

在定位行执行的命令组

n

读取下一个输入行,用下一个命令处理新的行

h

将模式缓冲区的文本复制到保持缓冲区

H

将模式缓冲区的文本追加到保持缓存区

x

互换模式缓冲区与保持缓冲区的内容

g

将保持缓冲区的内容复制到模式缓冲区

G

将保持缓冲区的内容追加到模式缓冲区

2、sed编程示例

  新建一个input.txt文件,作为演示例子,详情如下:

This is a Test SedCommd Request file:
    It Create by 2022-09-25

====================================================
Request Content:
    The above string is known as your user certificate subject, and it uniquely identifies this user
    To install this user certificate, please save this e-mail message into the following file.

2.1、sed命令选项示例

2.1.1、-n 选项

  sed编辑命令p实现打印匹配行功能,-n选项不打印sed编辑对象的全部内容。

  0

  第1条命令表示打印input文件的第1行,-n表示不打印intput文件的所有行,因此该命令运行结果只是input文件的第1行。

  第2条命令没有 -n 参数,首先显示input文件的第1行,然后将input文件的全部内容打印到标准输出。

sed命令打印范围行:

  

   sed命令打印匹配行,使用/pattern/方法进行模式匹配,表示打印匹配user关键字的行。

  

2.1.2、-e选项

  -e选项表示将下一个字符串解析为sed编辑命令,若只传递一个编辑命令给sed,-e选项可省略,即只有向sed命令传递多个编辑命令时,-e选项才有用。

  若需要将与匹配user关键字行的内容和行号都打印处理,需要向sed传递 "p" 和 "=" 两个编辑命令,此时需要使用 -e 选项,-e选项指定其后面紧跟着的字符串为sed编辑命令,打印匹配行内容及其行号的命令如下:

0

  第一个命令,打印行号;

  第二个命令,打印行内容及行号,传递两个编辑命令给sed。

  sed不支持同时待多个编辑命令的用法,如 :

sed -n 'user/p=' input.txt

  带多个编辑命令sed的一般格式为:

sed [选项] -e 编辑命令1 -e 编辑命令2 ... -e 编辑明令n 输入文件

2.1.3、-f选项

  -f选项只有调用sed脚本文件时才起作用,追加文本、插入文件、修改文本、删除文本和替换文本等功能往往需要几条sed命令来完成,将这些命令写入sed脚本,然后调用sed脚本来完成。

  sed编辑命令 a\ 符号用于追加文本,可以将指定文本的一行或多行追加到指定行后面,若不指定文本追加位置,sed默认放置到每一行后面,追加文本的格式为:

sed '指定地址a\text' 输入文件

  指定地址以匹配模式/pattern/或行号的形式给出,用于定位新文本的追加位置,sed对\a后的文本进行追加操作。

  sed命令追加文本:

  

  在关键字"file:"相匹配的行后追加文本内容"Append a new line",结果显示第1行之后已追加了上述文本。

  sed完成追加文本功能后,只是将结果输出到标准输出上,原始文件未做任何改变。

  使用sed脚本,创建append.sed脚本:

#!/bin/sed -f
# a\ 表示此处换行添加文本
/file:/a\
Append a new line.\
Append other line. 

  sed脚本第一行与bash Shell脚本一行,以sha-bang(#!)符号开头,sha-bang后面解释器的路径,sed脚本是sed命令的路径,查看sed所在路径:

  0

  sed选项使用 -f 表示正在调用脚本文件,-f 选项在脚本中比不可少,若无此选项,执行脚本时将报错。

  若追加的文本有多行,使用反斜杠符号"\"换行。

  赋予append.sed执行权限,并执行该脚本文件,即可得到结果。

  0

2.2、sed文本定位示例

2.2.1、匹配元字符

  sed命令所要匹配的目标字符串中包含元字符,需要使用转义符"\"屏蔽其特殊意义。

  匹配句点"."和"?"元字符:

  0

2.2.2、使用元字符进行匹配

  sed命令可使用正则表达式的元字符进行匹配,$在正则表达式中表示行尾,但在sed命令中却表示最后一行。

  0

  sed基本1命令可以放在单引号内,也可放在单引号外。

2.2.3、!符号

  !符号表示取反,x,y!表示匹配不在 x 和 y 行号范围内的行,打印不在 4 ~ 6 之间的行。

  0

  x!表示匹配除了x行号外的所有行,!符号不能用于关键字匹配,无法表示不与/pattern/匹配的行。

2.2.4、行号与关键字匹配限定行范围

  0

  打印与 Content: 的匹配行到最后一行。

2.3、sed基本编辑命令示例

2.3.1、插入文本

  插入文本与追加文本类似,区别仅在于追加文本时在匹配行的后面插入,而插入文本时在匹配行的前面插入,sed编辑命令的插入文本符号为 i\ ,插入文本格式:

sed '指定地址 i\text' 输入文件

  新建insert.sed脚本,内容如下:

#!/bin/sed -f
# i\ 换行插入文本
/file:/i\
insert a new line

  赋予insert.sed脚本执行权限:

  0

  执行sed脚本:

  0

  在 file: 关键字的匹配行上方插入了新文本 insert a new line。

2.3.2、修改文本

  修改文本是指将所匹配的文本行利用新文本替代,sed编辑命令的修改文本符号为 c/,修改文本的格式为:

sed '指定地址c\test' 输入文件

  新建mod.sed脚本,内容如下:

#!/bin/sed -f
# c\ 表示此处换行修改文本
/file:/c\
modify this line

  赋予权限并执行mod.sed脚本:

  0

  file: 关键字的匹配行被修改为了 modify this line。

2.3.3、删除文本

  sed删除文本命令可以将指定行或指定行范围进行删除,sed编辑命令的删除文本符号为d,删除文本的格式为:

指定地址 d

  sed编辑命令中删除操作符号是 d,后面不带 \ 符号,与附加、插入、修改等命令有所区别。删除文本可灵活的指定删除地址。

  删除文件的第一行和最后一行的方式:

  0

  删除文件第 1~5行,第5行到最后一行:

  0

2.3.4、替换文本

  sed替换文本操作将所匹配的文本行利用新文本替换,替换文本功能有相似之处,区别在于:替换文本可以替换一个字符串,而修改文本时对整行进行修改。替换文本通过替换选项使得文本替换更为灵活。

  sed编辑命令的替换文本符号为s,替换文本格式为:

sed /被替换的字符串/新字符串/[替换选项]

  s表示sed执行替换文本操作,sed命令首先匹配被替换的字符串,匹配成功后用新字符串替换它。替换选项对sed替换操作做进一步的细化。

  

选项

含义

g

表示替换文本中所有出现被替换字符串处

p

与 -n 选项结合,只打印替换行

w 文件名

表示将输出定向到一个文件

  默认情况下,sed s 命令将替换后的全部文本都输出,若要求只打印替换行,需结合使用 -n 和 -p 选项,命令格式如下:

sed -n 's/被替换的字符串/新字符串/p' 输入文件

  p选项与 -n 选项结合使用,只打印替换行。

  

  第一个命令,不加任何参数,结果为显示替换后文本的所有内容;

  第二个命令,将 -n 和 p 结合使用,结果仅为替换行;

  第三个命令,用了 -n 参数,但未加 p 选项,结果不打印任何内容。

2.3.5、写入一个新文件

  sed命令只是对缓冲区中输入文件的复制内容进行编辑,若要保存编辑结果,需要将编辑后的文本重定向到另一个文件,sed写入文件的符号为w,基本格式为:

指定地址 w 文件名

  将input.txt中1~6行写入output文件,通过指定行号范围来实现:

  0

  将 file 相匹配的行写入 output 文件:

  0

2.3.6、从文件中读入文本

  sed命令可将其他文件中的文本读入,并附加在指定地址之后,sed读入文件的符号为 r,基本格式为:

指定地址 r 文件名

  r 通知 sed 从另一个文件源中读入文本,新建一个名字为 otherfile.txt 文件,内容如下:

the first line of the other
the second line of the other
the third line of the other

  在匹配 file: 关键字的行后面加上 otherfile.txt中的内容,结果显示在匹配行后。

  0

2.3.7、退出命令

  sed命令的q选项表示完成指定地址的匹配后立即退出,基本格式为:

指定地址 q

  打印前5行退出:

  0

  若加上q选项,则表示匹配到第1个满足要求的字符串后退出,两条命令的执行结果如下:

  0

2.4、sed高级编辑命令

2.4.1、处理匹配行的下一行

  sed编辑命令 n 的意义是读取下一个输入行,用 n 后面的一个命令处理该行,此时通常由多个编辑命令,编辑命令n需要与 {} 符号结合使用。

  0

  找出certificate的匹配行,然后在匹配行的下一行执行 s/ll/99,在下一行将 ll 字符串替换为 99。结果显示为第1个certificate的匹配行是第10行,然后将第11行的install替换为 insta99。

2.4.2、sed缓冲区的处理

  sed有两种缓冲区:模式缓冲区(Pattern Buffer)和保持缓冲区(Hold Buffer)。

  sed的编辑命令可以对保持缓冲区进行处理,并与模式缓冲区的内容互换。

  0

  三个-e选项带上三个编辑命令组成。

  第1个-e选项后的编辑命令将 Content: 关键字的匹配行写入保持缓冲区(h命令指将模式缓冲区内容复制到保持缓冲区);

  第2个-e选项后的编辑命令是遇见know关键字匹配航时,将保持缓冲区的内容输出,并将know关键字的匹配行写入保持缓冲区,因此,原本know行的位置变成了 Content: 行,x命令是互换模式缓冲区和保持缓冲区的文本内容;

  第3个-e选项后的编辑命令,表示到最后一行时(用$符号匹配),将保持缓冲区的内容追加到模式缓冲区中。

2.4.3、利用分号分隔多个编辑命令

  除了使用 "-e" 和 "{}" 符号可以实现sed的多编辑命令之外,利用分号";"也可实现类似功能,基本格式为:

sed '编辑命令1;编辑明令2;...' 输入文件

  利用分号 ; 分隔多个编辑命令,用分号分隔两个替换操作:

  

   利用分号分隔多条编辑命令等价于 -e 选项引出多个编辑命令,用分号显得更为简洁。