sed 语法深入

sed   流编辑器(流编辑器可以对从管道这样的标准输入接收到的数据进行编辑.)
     -sed 是基于行的,按顺序对每一行执行命令。
     -sed 处理数据时,将一行读入其模式缓冲区,执行编辑命令,再打印模式缓冲区。然后它对后面的每一行重复这些步骤。
     -再次强调, sed是基于行的,逐行处理数据

基本操作:
     sed -e '5d'  // 删除第5行,其他行输出
        工作地址:  5 第五行
         执行的命令: d 删除操作
      sed -e '5,10d' // 删除5到10行 
         
利用正则指定地址范围:  将正则表达式用 两个斜杠/扩起来,指定一种模式,后面紧跟一条命令来处理与该模式匹配的行。习惯将命令用单引号扩起来比较好!
    
  
  
  1. sed  -e '/正则表达式/command'

     常见的命令: d 删除命令
               p 打印命令
     -e 使用脚本 -n(安静模式,不私自输出)与命令p搭配,输出指定模式的行
eg.
  
  
  1.  sed -e -n '/regexp/p'   # regexp就是正则表达式

使用两个用逗号分开的正则表达式,指定一个范围:
    sed -e '/Begin/,/End/command'
类似于 '1,5/p' ,只不过这里的起始和结束都是正则表达式,需要用//扩起来。
  eg. 
   
   
  1.     sed -n -e '/main[[:space:]]*(/ , /^}/p' /tmp/main.c
   //  [[:space:]]是posix字符集,用来表示所有空白字符(制表符、空格、新的行),加上*后,表示main和(之间有0个或多个空白.
 // 这个sed的起始匹配行:包含有 main ()或main()的行,结束匹配行:以 } 开头的行 

替换:  's///'
          's///g' 
   s/// 表示替换  g告诉sed执行全局替换 !!!
    没有g时只对第一个匹配项进行替换操作.
   常见命令:
      '1,10s///g' 对1-10行的所有匹配项执行替换命令
      '/Begin/,/End/s///g'  对Begin到End范围内的所有匹配行执行替换命令
    当正则表达式或替换字符串有斜杠‘/’出现时可以使用其他字符替换斜杠.
       's///' <==> 's:::' <==> 's###' ...
sed中模式之间交换位置
    ()之间的模式(各段)将被保留在模式缓冲区,\n可以实现对前面()之间的模式的引用,n从1到9.
  sed -r 's/(段1)(段2)(段3)/\1\2\3/g'  默认从左到右 \1\2\3 
  sed -r   's/(段1)(段2)(段3)/\3\2\1/g'   将 第一段和第三段交换位置
  ...
sed某一行前新增一行  
   插入命令: i
      sed  -e '地址范围 i\string'  //string为要追加的内容,不需要引号将string括起来
sed某一行后追加一行  
   追加命令:a      
       sed -e '地址范围 a\string'
sed 组合命令
  适合于: 需要将多个命令应用到同一行中
    指定多条命令时, sed会按顺序将命令应用到每一行。
  
  (1)  使用分号分隔命令
    eg. sed -n -e '=;p'  /etc/passwd  // 第一个命令=告诉sed打印行号,第二个命令p告诉sed打印改行.
  (2)  为每条命令使用一个 -e 参数
    sed -n -e '=' -e 'p'  /etc/passwd   // -e指定的命令一次应用到每一行
  (3) 命令太多时,将命令写入文本文件中,通过 -f 参数引用命令,就不需要-e参数了
    sed命令脚本:
      handle.sed 
  
  
  1.      1d # 告诉sed删除第一行
  2.      s#/sbin/nologin#/bash#g # 执行替换
  3.      p  # 告诉sed 打印该行
    再引用此文件:
      sed -n -f handle.sed /etc/passwd
  
sed 将多条命令应用到一个地址范围 
   应用场景:对一个范围内的所有行执行多条命令时
语法:  地址范围{命令串}    //命令之间用(;)隔开.
   sed -e '/Begin/,/End/{命令1;命令2;命令3....}/' 
eg. 
   sed -n -e '1,5{s#/sbin/nologin#/bash#g ; s/:/|/g ; p}' /etc/passwd
     // 对 /etc/passwd 中的1-5行依次执行 替换、再替换、打印.
 

sed 实际的例子:
  Unix和DOS/Windows系统纯文本格式的换行方式是不同的。基于Dos/Winsows的文本文件在每一行末尾有一个CR(回车)和LF(换行),而Unix文本每一行结尾只有一个换行。有时需要在Unix和Windows之间互相使用同一个文本文件,Unix上bash只要一遇见回车就出问题。
  利用 sed 实现windows和Unix之间文本文件的互相转换:
  Unix->Win:
   
   
  1.     sed -e 's/$/\r/g'  Myunix.txt > Mywin.txt # 在一行的末尾前插入回车

  Win->Unix:
   
   
  1.     sed -e 's/.$//g'  Mywin.txt > Myunix.txt # 将每行的最末字符回车删除


sed正则: 
    sed中,为了匹配特殊字符,必须将它用[::]扩起来!(类似posix字符集)
     - 比如: 要匹配行中的冒号‘:’,正则应这样写[:::],否则:就是一个普通的冒号.
     


总结: sed命令可分为两部分:

    第一部分: 选定地址范围。可以通过指定起始行和结束行来选定不分行,也可以通过匹配(正则)选定特定的范围,这给程序带来巨大的灵活性。
    第二部分: 对地址范围执行特定操作。常见的操作有替换(重要)、删除(d)、打印(p)、插入(i)、追加(a)
    sed 命令可以组合,完成复杂的任务。甚至写成脚本,定制想要的功能。
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值