且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

sed文本处理工具——基本命令(16)

更新时间:2022-08-21 20:56:26

1.Sed

Stream EDitor, 行编辑器

  sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。

如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

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

  参考:http://www.gnu.org/software/sed/manual/sed.html

 


2.用法

sed [option]... 'script' inputfile...   script: '地址命令'

 

常用选项:

-n:不输出模式空间内容到屏幕,即不自动打印

-e: 多点编辑,对每行处理时,可以有多个Script

-f: Script写到文件当中,在执行sed-f 指定文件路径,如果是多个Script,换行写

-r: 支持扩展的正则表达式

-i: 直接将处理的结果写入文件

-i文件名  在将处理的结果写入文件之前备份一份

 


3.sed工具

定址取决于对哪些行进行编辑。地址的格式可以是数字、正则表达式,或二者结合,如果没有指定地址,则sed将处理文件的所有行。

 

地址定界:

(1) 不给地址:对全文进行处理

        sed -n 'p' 文件   打印全部内容

(2) 单地址:

      #:指定的行

        sed -n '2p' 文件    打印第2

      /pattern/:被此处模式所能够匹配到的每一行

        sed -n '/linux/p' 文件   打印带有linux的行

(3) 地址范围:

      #,#

        sed-n '2,3p'  打印2-3

      #,+#

        sed-n '2,+1p'  打印第2行和其后面2行,即2-4

      /pat1/,/pat2/

        sed-n '/redhat/,/linux/p'  打印由有redhat的行开头,有linux的行为结尾

sed文本处理工具——基本命令(16)

      #,/pat1/

        sed-n '2,/linux/p'  打印第2行到以后第一个linux所在的行为结尾

sed文本处理工具——基本命令(16)

(4) ~:步进

      sed-n '1~2p'  只打印奇数行

      sed-n '2~2p'  只打印偶数行

    #1~#2意思就是从#1开始,每次都数下面+#2个数)

sed文本处理工具——基本命令(16)

所以如图,2~3表示从2开始,每次数下面第3个数,就是2,5,8

 


4.编辑命令

d: 删除模式空间匹配的行,并立即启用下一轮循环

   sed'2d' pets

p:打印当前模式空间内容,追加到默认输出之后

   sed'2p' pets

sed文本处理工具——基本命令(16)


a [\]text:在指定行后面追加文本

   sed'2a\123\n456\n789' pets

i [\]text:在行前面插入文本

   sed'2i\123\n456\n789' pets

c [\]text:替换行为单行或多行文本

   sed'2c\123\n456\n789' pets    (以上三条都支持使用\n实现多行追加)

sed文本处理工具——基本命令(16)


w /path/somefile: 保存模式匹配的行至指定文件

   sed-n '3w /root/3.file' pets

r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后

   sed'3r /root/mage.txt' pets

sed文本处理工具——基本命令(16)


=: 为模式空间中的行打印行号

   sed'=' pets.bak 

sed文本处理工具——基本命令(16)


!:模式空间中匹配行取反处理

   sed-n '2!p' pets

sed文本处理工具——基本命令(16)

 

s///:查找替换,支持使用其它分隔符,s@@@s###替换标记:

g: 行内全局替换

   sed's/dog/cat/g' pets

sed文本处理工具——基本命令(16)


5.示例

  sed '2p'/etc/passwd  多打印一遍passwd第二行

  sed -n '2p'/etc/passwd  只打印passwd第二行

  sed -n '1,4p'/etc/passwd  打印passwd 1-4

  sed-n '/root/p' /etc/passwd  打印passwd中带有root的行

  sed -n '2,/root/p' /etc/passwd  打印passwd中从2行开始到有root的那行

  sed -n '/^$/='file  显示空行行号

  sed -n-e '/^$/p' -e'/^$/=' file  打印空白行并打印其行号

  sed '/root/a\superman'/etc/passwd  在带有root的行后加入superman

  sed '/root/i\superman'/etc/passwd  在带有root的行前加入superman

  sed '/root/c\superman'/etc/passwd  将带有root的行替换成superman

  sed '/^$/d' file  删除空白行

  sed '1,10d' file  删除1-10

  nl /etc/passwd |sed '2,5d'  passwd带有行号的列出然后删除2-5

  nl /etc/passwd |sed '2a tea'  passwd带有行号的列出然后在第2行后面加上一行为tea

  sed's/test/mytest/g' example  将每行的test都替换成mytest

  sed -n 's/root/&superman/p'/etc/passwd  passwd中带有root的行第一个root单词后加上superman,变成rootsuperman

  sed -n 's/root/superman&/p'/etc/passwd  passwd中带有root的行第一个root单词前加上superman,变成supermanroot

  sed -e 's/dog/cat/'-e 's/hi/lo/' pets  将每行第一个dog变成cat,第一个hi变成lo

  sed -i.bak 's/dog/cat/g'file  file中的dog替换成cat存在file中,并将原来修改之前的file存在file.bak 

 


6.高级编辑命令

sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的模式空间(pattern space,另一个是起辅助作用的保持空间(hold space)这2个空间的使用。

模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。
保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。

正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!

前面基本用法中也有提到模式空间,即为处理文件中一行内容的一个临时缓冲区。处理完一行之后就会把模式空间中的内容打印到标准输出,然后自动清空缓存。

而这里说的保持空间是sed中的另外一个缓冲区,此缓冲区正如其名,不会自动清空,但也不会主动把此缓冲区中的内容打印到标准输出中。而是需要以下sed命令进行处理:

  P:打印模式空间开端至\n内容,并追加到默认输出之前

  h: 把模式空间中的内容覆盖至保持空间中

  H:把模式空间中的内容追加至保持空间中

  g: 从保持空间取出数据覆盖至模式空间

  G:从保持空间取出内容追加至模式空间

  x: 把模式空间中的内容与保持空间中的内容进行互换

  n: 读取匹配到的行的下一行覆盖至模式空间

  N:读取匹配到的行的下一行追加至模式空间

  d: 删除模式空间中的行

  D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会启动正常的新循环。

 


7、高级命令示例

 sed -n'n;p' FILE   显示偶数行

 sed'1!G;h;$!d' FILE   倒序显示

 sed -n'1!G;h;$p' FILE  倒序显示

 sed 'N;D' FILE  显示最后一行

 sed'$!N;$!D' FILE  显示最后两行

 sed '$!d'FILE  显示最后一行

 sed‘G’FILE   每行后面加空行

 sed‘g’FILE   把每行内容都替换成空行

 sed‘/^$/d;G’ FILE   确保每一行下面都有且只有一个空行

 sed 'n;d'FILE  显示奇数行


 

 

本文转自 Ty_endless 51CTO博客,原文链接:http://blog.51cto.com/tyendless/1961187