文本处理工具sed

  1. 云栖社区>
  2. 博客>
  3. 正文

文本处理工具sed

技术小甜 2017-11-14 19:06:00 浏览659
展开阅读全文

sed用法

一、sed简介

sed是一种在线编辑器,它一次处理一行内容!!!j_0058.gif处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断循环,直到文件末尾。如果没有使用特殊命令,那么模式空间的内容会在两个循环之间清除,而保留空间的内容不会清除。使用sed处理文件,内容并没有改变,除非使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

二、地址定界:可以通过定址来定位所希望编辑的行

j_0057.gif1、不给地址:对全文进行处理

wKioL1mhJovjT8YfAAAticDW0Lw083.jpg

j_0057.gif2、单地址:

(1)#: 指定的行。比如sed -n '2p' 表示对第二行进行打印处理,p表示打印

wKiom1mhJpqBWzvqAAAbTgUYXH0236.jpg

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

比如sed -n '/b/p' 表示对包含字符b的行进行打印处理

wKiom1mhJprRRxsrAAASI6eFlEU263.jpg 

j_0057.gif3、地址范围:

(1)#,# :表示第#行到第#

比如sed -n '2,4p'表示打印第二行到第四行的内容

wKioL1mhJozw4n-LAAAeImr0f60335.jpg

(2)#,+# :比如3,+2 表示第3行到第3+2行。用法同上。不再示例

(3)/pat1/,/pat2/:表示第一次被/part1/匹配到的行开始直到第一次被/part2/匹配到的行结束

比如:sed -n '/b/,/d/p'表示打印第一次匹配到的包含字符b的行开始直到第一次匹配到的包含字符d的行结束

wKioL1mhJoyjL3gvAAAT-v5LWlc488.jpg 

(4)#,/pat1/:表示从第#行开始直到第一次被/part1/匹配到的行结束。用法同上。不再示例

j_0057.gif4、 ~:步进。(等差数列)

比如sed -n '1~2p' 表示从第1行开始,每两行匹配一行。即只打印奇数行。

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

wKiom1mhJpvTW6BYAAAT6Rg4G3g261.jpg

三、用法

sed [option] script inputfile

常用选项:

-n

不输出模式空间内容到屏幕,即不自动打印。(默认打印)

-e

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

-f

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

-r

支持扩展的正则表达式

-i

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

-i.bak

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

下面举例说明以上选项的功能:j_0005.gif

1)-n:通过下图两条命令对比可发现,-n可以取消默认打印。

wKiom1mhJziT8T0MAAAwa37bmlA035.jpg

2)-e:即表示对每行进行处理时,可以有多个执行命令

wKioL1mhJyqz0DzFAAAj_n-EvQo224.jpg
(3)-f:比如在文件ab中写具体执行命令(不需要加单引号),使用-f就可以使用ab中的script对文件进行处理

wKioL1mhJyqhp6qQAAAx4GloCfU267.jpg 

(4)-r :支持扩展的正则,sed本来就支持基本正则,加上-r就支持扩展正则。

(5)-i :比如sed -n -i '2p' ap,表示将结果直接写入文件。Sed一般不改变原文件,使用-i就会修改原文件内容了。

wKiom1mhJzmhRH98AAAWTuG2RbQ547.jpg 

6-i.bak : 比如sed -i.bak 'p' ap,表示在修改原文件之前备份一份

wKiom1mhJzqQVJy9AAAv-E1XriY140.jpg 

四、编辑命令:

(1) d: 删除模式空间匹配的行

比如:sed '2d' ap 表示删除ap文件中的第二行

wKiom1mhKDTzTaHiAAAdM8dzT3Q835.jpg

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

   P:打印当前模式空间内容,追加至默认输出之前

比如sed '2p' ap表示打印第二行,并且把该行追加到默认输出的第二行之后

wKiom1mhKDSj2a2gAAASalrPyk0874.jpg

(3)a [\]text:在指定行后面追加文本,支持使用\n实现多行追加

比如sed '2a\123\n456' ap表示在第二行之后追加123\n456

wKiom1mhKDXD3lDSAAAW-Lk5WnI097.jpg 

4i [\]text:在行前面插入文本,用法同a[\]text

比如sed '2i\123\n456' ap表示在第二行之前插入123\n456

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

比如sed '2c\123\n456' ap 表示替换第二行为123\n456

wKioL1mhKCfxG6D_AAAUoH60a2k696.jpg 

(6)w /path/somefile: 保存模式匹配的行至指定文件的末尾

   W /path/somefile :追加模式空间的第一行到文件的末尾。

比如sed -n '3w /root/3.file' ap 表示将ap中的第三行保存至 /root/3.file

wKioL1mhKCfilcKNAAAZNsfNVXo915.jpg

(7)r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后(匹配到的每行后边都加)

比如sed '1,3r /root/fl.txt ' ap表示读取/root/fl.txt 中的内容插入到ap中匹配到第1、2、3行之后

wKiom1mhKDaSyGqoAAAhFpc1S4I339.jpg 

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

比如sed '=' ap 表示给ap文件中的每一行都打印行号 ,行号独占一行

wKioL1mhKCjwvj-EAAAS-eq_rIs124.jpg 

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

比如sed -n '2!p' ap 表示打印除第2行之外的行

wKiom1mhKDbyYG7aAAAQRyq0_VA326.jpg

(10)g :把保留空间的内容覆盖至模式空间

比如sed 'g' ap表示把ap中每行内容替换成空行(保留空间本来为空,所以把空行覆盖至模式空间)

wKiom1mhKDfT9no_AAAQgaZUVv4502.jpg
 G :追加保留空间的内容至模式空间

比如sed 'G' ap表示给ap文件每行之后加空行(保留空间本来为空,所以把空行追加至模式空间)

wKioL1mhKCmjKtEIAAAV818SiuA676.jpg

(11)n :读取下一个输入行,覆盖至模式空间。比如首先取出第一行至模式空间,本来应该处理第一行,但是使用n之后,就会取出第二行覆盖至模式空间,从而处理第二行而不是第一行。

比如sed -n 'n;p' ap表示打印出2、46....等偶数行。

wKiom1mhKDvzk4obAAAcTSmbgRw004.jpg
 N :追加下一个输入行到模式空间。相当于模式空间读入两行内容,处理完之后,再读入两行,当有基数行时,最后一行不处理。

wKioL1mhKC2D5VH-AAAnUmMQsqI070.jpg 

(12) h :把模式空间的内容覆盖至保留空间

 比如sed '1!G;h;$!d' ap 表示倒序显示。因为1!G表示如果不是第一行就把保留空间的内容追加到模式空间,h表示把模式空间的内容覆盖到保留空间,$!d表示如果不是最后一行就删除模式空间的内容,所以直到最后一行进入模式空间,然后把保留空间的内容追加到模式空间,此时不需要再删除,那么模式空间的内容就被输出。

wKioL1mhKC6ih2SHAAAf159NhjU020.jpg

 H :追加模式空间的内容到保留空间

比如 sed 'H;g;$!d' ap表示在文件开头加一个空行。H表示将模式空间的内容追加到保留空间,保留空间本身是空行,所以使用g再把保留空间内容覆盖至模式空间时,在第1行前面有个空行。

wKiom1mhKDzC4JINAAARSicioWg788.jpg 

(13)d :删除模式空间的行。

比如 sed 'n;d' ap 表示删除偶数行,因为n的作用使模式空间只处理偶数行,其他行默认输出

wKioL1mhKDHj863tAAAO9Us0K8Q094.jpg          

 D:删除模式空间的第一行。

比如sed 'N;D' ap 表示只显示最后一行,因为N;D使模式空间每次进去一行就会删除前一行,直到最后一行进去删除前一行结束,然后默认打印最后一行。

wKiom1mhKEDC1gh9AAAYNvoq3ZI313.jpg 

五、替换标记

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

格式:s/匹配的内容/替换的内容/[替换标记]
j_0057.gif(1)g:表示行内全面替换。

比如sed 's/dog/cat/g' ab表示查找ab文件中的dog替换为cat

 而sed 's/dog/cat/' ab表示查找每一行第一个dog替换为cat

wKiom1mhKRXh27LNAAAqiQ5EfsU589.jpg

j_0057.gif(2)p:表示打印行。

比如 sed 's/dog/cat/p' ab表示查找每一行第一个dog替换为cat,并且打印该行wKiom1mhKRXjrQDeAAAg-9qZva0462.jpg

j_0057.gif(3)w:表示把该行写入一个文件。

比如sed 's/dog/cat/w 3.file' ab 表示替换完成之后将该行写入3.file文件wKioL1mhKQeDQu4FAAAfh66Cld8975.jpg 

   以上就是关于sed的一些常用的命令,你是否懂了呢???是骡子是马拉出来溜溜就知道啦j_0049.gif练习一下吧!

1、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

  sed -r 's/^#[[:space:]]+//' /etc/fstab

2、在/etc/fstab文件中不以#开头的行的行首增加#号

  cat /etc/fstab |sed  's/^[^#]/#&/'

3、处理/etc/fstab路径,使用sed命令取出其目录名和基名

  echo /etc/fstab |sed -r  's#(^/.*/)([^/].*/?$)#dirname:\1\nbasename:\2#'

4、利用sed 取出ifconfig命令中本机的IPv4地址

  ifconfig|sed -n '2p' |sed 's/^.*addr://'|sed 's/  Bcast.*//' 或者

  ifconfig|sed -r -n '2s/^.*addr:(.*)  Bcast.*$/\1/p'

5、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次 数

 ll /media/CentOS_6.9_Final/Packages/ |sed -r -n 's/^.*\.([^.]+)\.rpm$/\1/p'|sort|uniq -c

6、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

sed方法:cat /etc/init.d/functions |sed -n -r 's/[^[:alpha:]]+/\n/gp'|sed     '/^$/d'|sort|uniq -c|sort

grep方法:cat /etc/init.d/functions |egrep -o "[[:alpha:]]+"|sort|uniq -c|sort  

7、将文本文件ab的n和n+1行合并为一行,n为奇数行

    cat ab |sed -n '$!N;s/\n/ /;p'

8、显示/etc/passwd文件的最后一行

  sed  'N;D' /etc/passwd 或者

  sed '$!d' /etc/passwd

j_0080.gif
















本文转自lc0108131451CTO博客,原文链接: http://blog.51cto.com/13150617/1959557,如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论
技术小甜
+ 关注