linux常用命令sed

来源:互联网 发布:单页商城源码 编辑:程序博客网 时间:2024/06/14 12:55

linux之sed用法

      sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法

sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。

sed命令的语法格式:

sed的命令格式: sed [option]   'sed command'   filename

sed的脚本格式:sed [option]   -f    'sed script'    filename

    sed脚本文件 [option] 输入文件            第一行具有sed命令解释器的sed脚本文件

sed命令的选项(option):

-n :只打印模式匹配的行

-e :直接在命令行模式上进行sed动作编辑,此为默认选项

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

     f 如果正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,如
          sed -f myscript.sed input_file  这里myscript.sed即为支持sed命令的文件
 

-r :支持扩展表达式

-i :直接修改文件内容,而不是由萤幕输出。       


常用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

举例:(假设我们有一文件名为ab)
     删除某行
     [root@localhost ruby# sed '1d' ab              #删除第一行 
     [root@localhost ruby] # sed '$d' ab              #删除最后一行
     [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行
     [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最后一行

  显示某行
.    [root@localhost ruby# sed -n '1p' ab           #显示第一行 
     [root@localhost ruby] # sed -n '$p' ab           #显示最后一行
     [root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行
     [root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行

  使用模式进行查询
     [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
     [root@localhost ruby] # sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

  增加一行或多行字符串
     [root@localhost ruby]# cat ab
     Hello!
     ruby is me,welcome to my blog.
     end
     [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
     Hello!
     drink tea
     ruby is me,welcome to my blog. 
     end
     [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
     Hello!
     drink tea
     ruby is me,welcome to my blog.
     drink tea
     end
     drink tea
     [root@localhost ruby] # sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n
     Hello!
     drink tea
     or coffee
     ruby is me,welcome to my blog.
     end

  代替一行或多行
     [root@localhost ruby] # sed '1c Hi' ab                #第一行代替为Hi
     Hi
     ruby is me,welcome to my blog.
     end
     [root@localhost ruby] # sed '1,2c Hi' ab             #第一行到第二行代替为Hi
     Hi
     end

  替换一行中的某部分
  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)
     [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby

     插入
     [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
     [root@localhost ruby]# cat ab
     Hello!
     ruby is me,welcome to my blog.
     end
     bye

     删除匹配行

      sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)

      替换匹配行中的某个字符串

      sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

使用sed在文本中定位文本的方式:
    x       x为一行号,比如1
    x,y     表示行号范围从x到y,如2,5表示从第2行到第5行
    /pattern/    查询包含模式的行,如/disk/或/[a-z]/
    /pattern/pattern/   查询包含两个模式的行,如/disk/disks/
    /pattern/,x  在给定行号上查询包含模式的行,如/disk/,3

    x,/pattern/  通过行号和模式查询匹配行,如 3,/disk/
    x,y!    查询不包含指定行号x和y的行

基本sed编辑命令:
    p      打印匹配行                      c/    用新文本替换定位文本
    =      显示文件行号                    s     使用替换模式替换相应模式
    a/     在定位行号后附加新文本信息        r     从另一个文本中读文本
    i/     在定位行号后插入新文本信息        w     写文本到一个文件
    d      删除定位行                      q     第一个模式匹配完成后退出或立即退出
    l      显示与八进制ASCII代码等价的控制字符        y  传送字符
    n      从另一个文本中读文本下一行,并附加在下一行   {}     在定位行执行的命令组
    g      将模式2粘贴到/pattern n/




  1. #######sed的匹配模式支持正则表达式#####################  
  2. sed'5 q'/etc/passwd#打印前5行  
  3. sed-n '/r*t/p'/etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行  
  4. sed-n '/.r.*/p'/etc/passwd#打印匹配有r的行并且r后面跟任意字符  
  5. sed-n '/o*/p'/etc/passwd#打印o字符重复任意次  
  6. sed-n '/o\{1,\}/p'/etc/passwd#打印o字重复出现一次以上  
  7. sed-n '/o\{1,3\}/p'/etc/passwd#打印o字重复出现一次到三次之间以上  

  1. [root@jie1 ~]# sed -i '/DEVICE/c\Ethernet' test   
  2.         #匹配DEVICE的行,替换成Ethernet这行  
  3. [root@jie1 ~]# sed -i 's/static/dhcp/' test       
  4.         #把static替换成dhcp(/,@,#都是前面所说的地址定界符)  
  5. [root@jie1 ~]# sed -i '/IPADDR/s@22\.1@10.12@' test  
  6.         #匹配IPADDR的行,把22.1替换成10.12由于.号有特殊意义所有需要转义  
  7. [root@jie1 ~]# sed -i '/connect/s#YES#NO#' test   
  8.         #匹配connect的行,把YES替换成NO  
  9. [root@jie1 ~]# sed -i 's/bin/tom/2g' test         
  10.         #把所有匹配到bin的行中第二次及第二次之后出现bin替换成tom  
  11. [root@jie1 ~]# sed -i 's/daemon/jerry/2p' test    
  12.         #把所有匹配到bin的行中第二次出现的daemon替换成jerry,并在生产与匹配行同样的行  
  13. [root@jie1 ~]# sed -i 's/adm/boss/2' test         
  14.         #把所有匹配到adm的行中仅仅只是第二次出现的adm替换成boss  
  15. [root@jie1 ~]# sed -i '/root/{s/bash/nologin/;s/0/1/g}' test  
  16.         #匹配root的行,把bash替换成nologin,且把0替换成1  
  17. [root@jie1 ~]# sed -i 's/root/(&)/g' test                   
  18.         #把root用括号括起来,&表示引用前面匹配的字符  
  19. [root@jie1 ~]# sed -i 's/BOOTPROTO/#BOOTPROTO/' test        
  20.         #匹配BOOTPROTO替换成#BOOTPROTO,在配置文件中一般用于注释某行  
  21. [root@jie1 ~]# sed -i 's/ONBOOT/#&/' test                   
  22.         #匹配ONBOOT的行的前面添加#号,在配置文件中也表示注释某行  
  23. [root@jie1 ~]# sed -i '/ONBOOT/s/#//' test                  
  24.         #匹配ONBOOT的行,把#替换成空,即去掉#号,也一般用作去掉#注释  
  25. #================执行以上sed命令之后文件显示的内容====================  

sed引用变量:(在自动化shell脚本 中也经常会使用到变量)

第一种当sed命令里面没有默认的变量时可以把单引号改成双引号;

第二种当sed命令里面有默认的变量时,那自己定义的变量需要加单引号,且sed里面的语句必须用单引

  1. [root@jie1 ~]# cat >> myfile << EOF  
  2. > hello world  
  3. > i am jie  
  4. > how are you  
  5. > EOF   #先生成一个文件  
  6. [root@jie1 ~]# cat myfile  
  7. hello world  
  8. i am jie  
  9. how are you  
  10. [root@jie1 ~]# name=li  
  11.          #定义一个变量,且给变量赋值  
  12. [root@jie1 ~]# sed -i "s/jie/$name/" myfile  
  13.          #把匹配jie的字符替换成变量的值  
  14. [root@jie1 ~]# cat myfile  
  15. hello world  
  16. i am li  
  17. how are you  
  18. [root@jie1 ~]# sed -i "$a $name" myfile  
  19.           #当sed命令也有默认变量时,在去引用自己定义的变量会出现语法错误  
  20. sed: -e expression #1, char 3: extra characters after command  
  21. [root@jie1 ~]# sed -i '$a '$name'' myfile  
  22.           #在引用自定义的变量时,sed语句必须用单引引住,然后把自定义的变量也用单引号引住  
  23. [root@jie1 ~]# cat myfile  
  24. hello world  
  25. i am li  
  26. how are you  
  27. li  
  28. [root@jie1 ~]#  
学会sed的使用是写自动化shell脚本的基础,sed也是一个非常有用且重要的命令,是文本处理工具之一,以上是我自己学习总结的sed命令简单的用法,sed还有更高级的用法,也还在学习中。

http://www.cnblogs.com/ctaixw/p/5860221.html


0 0