三剑客之sed经常使用操做

Sed
Sed是一个强大的文本处理工具
能够采用正则匹配,对文本进行插入删除修改等操做
Sed处理的时候,一次处理一行,每一次把当前处理的存放在临时缓冲区,处理完后输出缓冲区内容到屏幕,而后把下一行读入缓冲区,如此重复,直到结尾。


一、命令格式和参数
sed [-nefr] [动做] 文件
参数:
-n 安静模式,在sed处理的时候,全部来自STDIN的数据都会被输出到终端,加上-n会只输出处理的哪行
-e 直接在命令列上进行sed动做编辑
-f 直接将sed的动做写在文件内
-r sed动做支持延伸的正则表达(默认只是基础正则)
-i 直接修改文件内容(慎用,尤为是用系统文件作练习的时候)


动做:
append:增长,在当前行的下一行增长
c   :取代,取代n1到n2之间的行
d delete:删除
i 插入,目前行的上一行插入
p 打印,经常与-n使用
s 取代,s/old/new/g


二、基础用法详解
(1)第一行以后添加一行
app

  1. [root@localhost ~]# nl file.txt | sed "1a add text"  ide

  2.      1  wtmp begins Mon Feb 24 14:26:08 2014  工具

  3. add text  this

  4.      2  192.168.0.1  url

  5.      3  162.12.0.123  spa

  6.      4  this is the last line  .net

(2)第一行以前添加一行 copy3d

  1. [root@localhost ~]# nl file.txt | sed "1i add text"  code

  2. add text  orm

  3.      1  wtmp begins Mon Feb 24 14:26:08 2014  

  4.      2  192.168.0.1  

  5.      3  162.12.0.123  

  6.      4  this is the last line  

(3)删除第2,3行

  1. [root@localhost ~]# nl file.txt | sed "2,3d"  

  2.      1  wtmp begins Mon Feb 24 14:26:08 2014  

  3.      4  this is the last line  

(4)打印第2,3行 copy

  1. [root@localhost ~]# sed -n "2,3p" file.txt   

  2. 192.168.0.1  

  3. 162.12.0.123  


这里要提到的是,尽可能使用-n,否则会出现这样的结果 copy

  1. [root@localhost ~]# sed "2,3p" file.txt   

  2. wtmp begins Mon Feb 24 14:26:08 2014  

  3. 192.168.0.1  

  4. 192.168.0.1  

  5. 162.12.0.123  

  6. 162.12.0.123  

  7. this is the last line  


(5)把168换成169
先看源文件 copy

  1. [root@localhost ~]# cat file.txt   

  2. wtmp begins Mon Feb 24 14:26:08 2014  

  3. 192.168.0.1  

  4. 162.12.0.123  

  5. this is the last line  

处理后 copy

  1. [root@localhost ~]# sed "s/168/169/g" file.txt   

  2. wtmp begins Mon Feb 24 14:26:08 2014  

  3. 192.169.0.1  

  4. 162.12.0.123  

  5. this is the last line  


(6)插入多行

  1. [root@localhost ~]# nl file.txt | sed "2afirst\nsecond" file.txt   

  2. wtmp begins Mon Feb 24 14:26:08 2014  

  3. 192.168.0.1  

  4. first  

  5. second  

  6. 162.12.0.123  

  7. this is the last line  


(7)匹配数据,而后进行操做
只须要在上述的基础上加上正则匹配
sed "/匹配的模式/处理的方式" file.txt 
sed "/^root/d" file.txt 对开始有root的删除
例如
匹配begin,并删除改行 copy

  1. [root@localhost ~]# nl file.txt | sed "/begin/d"  

  2.      2  192.168.0.1  

  3.      3  162.12.0.123  

  4.      4  this is the last line  

匹配123,而且把含有123的行162都替换成172 copy

  1. [root@localhost ~]# nl file.txt | sed "/123/{s/162/172/g;q}"  

  2.      1  wtmp begins Mon Feb 24 14:26:08 2014  

  3.      2  192.168.0.1  

  4.      3  172.12.0.123  

  5.      4  this is the last line  

这里大括号{}里能够执行多个命令,用;隔开便可,q是退出
(8)连续编辑 -e
删除第二行,而且匹配把last替换成new

  1. <pre name="code" class="plain">[root@localhost ~]# nl file.txt | sed -e "2d" -e "s/last/new/"  

  2.      1  wtmp begins Mon Feb 24 14:26:08 2014  

  3.      3  162.12.0.123  

  4.      4  this is the new line  



(9)直接修改文件,切记不要修改系统文件 copy

  1. [root@localhost ~]# sed -i "/begin/{s/24/25/g}" file.txt   

  2. [root@localhost ~]# cat file.txt   

  3. wtmp begins Mon Feb 25 14:26:08 2014  

  4. 192.168.0.1  

  5. 162.12.0.123  

  6. this is the last line  



三 、一个比较有趣的例子
如何替换\n也就是把全部的行都归为一行

第一种方式 copy

  1. [root@localhost ~]# sed ':a;N;$!ba;s/\n/ /g' file.txt   

  2. wtmp begins Mon Feb 25 14:26:08 2014 192.168.0.1 162.12.0.123 this is the last line  


第二种方式opy

  1. [root@localhost ~]# tr "\n" " " < file.txt   

  2. wtmp begins Mon Feb 25 14:26:08 2014 192.168.0.1 162.12.0.123 this is the last line last linen  

相关文章
相关标签/搜索