Shell学习---sed

       sed是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以是来自键盘输入、文件重定向、字符串、变量,甚至来自于管道的文本。sed从文本的一个文本行或标准输入中读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此命令要求的行号进行编辑,重复此过程,直到命令行或脚本的所有命令都执行完毕。相对于诸如vi等其他文本编辑器,sed可以一次性处理所有的编辑任务,显得非常高效,为用户节省立大量的时间,sed适用于以下三种场合:

1.编辑相对于交互式文本编辑器而言太大的文件。
2.编辑命令太复杂,在交互式文本编辑器中难以输入的情况。
3.对文件扫描一遍,但是需要执行多个编辑函数的情况。

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

sed 'sed命令' input_file > result_file

一、sed命令选项的一组例子

1.sed命令的-n选项

-n选项的不打印功能是指:不打印sed编辑对象的全部内容。

sed编辑命令p实现打印匹配行功能。

例如:

sed -n '1p' input

-n表示不打印input文件的所有行,因此,该命令的运行结果只是input文件的第一行,去掉-n,则除了打印input文件的第一行外,还会打印input文件的所有内容。

sed -n '3,6p' input

打印input文件的第3~6行。

打印匹配模式行

sed -n '/模式/p' input

注意:sed是大小写敏感的。

2.sed命令的-e选项

-e选项表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,-e选项可以省略,换句话说,只有向sed命令传递多个编辑命令时,-e选项才有用武之地。

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

sed -n -e '/hello/p' -e '/hello/=' *


3.sed命令的-f选项

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

下面简介追加文本:

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

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

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

通过一个脚本来实现向文本追加

(1)创建append.sed写入:
#!/bin/sed -f
/file:/a\
lanzhihui is a good boy!\   #追加多行使用'\'
hahahhaahh

(2)修改append.sed脚本执行权限,然后执行该脚本文件,即可得到结果。

chmod u+x append.sed

./append.sed input

(3)sed脚本的执行方法与bash脚本是一样的。


二、sed文本定位的一组例子

1.匹配元字符

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

sed '/\./p' input

sed '/\$/p' input

2.使用元字符进行匹配

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

sed -n '$p' input

3.!符号

!符号表示取反,x,y!表示匹配不在x和y行号范围内的行。

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

4.使用行号与关键字匹配限定行范围

sed -n '/seugrid/,$p' input    #打印与seugrid的匹配行到最后一行

sed -n '3,/seugrid/p' input    #打印第3行到与seugrid的匹配行


三、sed基本编辑命令的一组例子

1.插入文本

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

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

插入脚本
#!/bin/sed -f
/file:/i\       #要修改的位置
#要插入的内容

2.修改文本

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

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

修改脚本
#!/bin/sed -f
/file:/c\       #要修改的位置
#要修改的内容

3.删除文本

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

指定地址d

注意:sed编辑命令中的删除操作符号是d,后面没有带'\'符号,与追加、插入、修改等命令有所区别。删除文本可以灵活地制定删除地址。例如:

sed '1d' input  #删除第一行

sed '$d' input  #删除最后一行

sed '1,10d' input  #删除第1~10行

sed '5,$d' input  #删除第5到最后一行

删除脚本
#!/bin/sed -f
/[Cc][Ee][Rr][Tt][Ii][Ff][Ii][Cc][Aa][Tt][Ee]/d

表示删除匹配certificate关键字的所有行,用正则表达式[]符号表示在匹配certificate关键字时不区分大小写。

4.替换文本

sed替换文本操作将所匹配的文本行利用新文本替换,替换文本与修改文本功能有相似之处,它们之间的区别在于:替换文本可以替换一个字符串,而修改文本是对整行进行修改。另外,替换文本通过替换选项使得文本替换更为灵活,功能更为强大,sed编辑命令的替换文本符号为s,替换文本的格式为:

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

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

选项:
g  表示替换文本中所有出现被替换字符串之处
p  与-n选项结合,只打印替换行
w 文件名 表示将输出定向到一个文件

p
(1)默认情况下,sed s命令将替换后的全部文本都输出,如果要求只打印替换行,需要结合使用-n和-p选项,命令格式如下:
sed -n 's/被替换的字符串/新字符串/p' 输入文件

上述命令如果缺少p选项,将不打印任何内容。与-n选项结合,只打印替换行。

g
(2)g选项的解释是:替换文本中所有出现被替换字符串之处。
例如:如果一行中出现两次被替换字符串,没有加入g选项则只替换第一个匹配的字符串为新字符串,如果加入g选项,则两个都被替换。
换句话说,当被替换字符串在文本每行至多出现一次时,是否带有g选项的结果是一样的;只有当被替换字符串在某行出现2次以上时,g选项才发挥作用。

w
(3)w选项后加文件名表示将输出定向到这个文件,如果输出文件未曾建立,sed命令自动建立输出文件,默认目录是当前工作目录。

(4)sed替换文本中经常使用到的&符号,&符号可用来保存被替换的字符串以供调用。

sed -n 's/seu/(&)/pg' input
sed -n 's/seu/(seu)/pg' input


5.写入一个新文件

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

6.从文件中读入文本

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

指定地址 r 文件名

7.退出命令

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

8.变换命令

sed命令的y选项表示字符变换,它将一系列的字符变换为相应的字符,sed y命令是对字符的逐个处理,它的基本格式为:

sed 'y/被变换的字符序列/变换的字符序列/' 输入文件

9.显示控制字符

控制字符就是非打印字符,如退格键、F1键、Shift键等,有些文件中会包含这些字符,sed l命令可以显示出文件中的控制字符,方便用户对控制字符进行处理。

10.在定位行执行命令组

sed编辑命令中的"{}"符号可以指定在定位行上所执行的命令组,它的作用与sed的-e选项类似,都是为了在定位行执行多个编辑命令。

你可能感兴趣的:(shell,正则表达式,脚本,sed)