zoukankan      html  css  js  c++  java
  • sed

    sed

      sed是一种新型的,非交互式的编辑器,他能执行与编辑器vi和ex相同的编辑任务。sed编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。可以使用shell重定向来保存输出结果,默认情况下,所有输出行都被打印到屏幕上。

      sed编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed的命令就是在vi和ed/ex编辑器中见到的那些。sed把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲,sed处理完模式空间中的行后(即在改行上执行sed命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。sed每行处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。

            文本文件(this is a line)----------------->缓存模式(this is a line)------------------------->sed的输出(屏幕输出)(this is a line)

    1.命令格式

      sed [ option ] 'command' 输入文本

    说明:

      sed命令在没有给定的位置时,默认会处理所有行。

      sed支持以下几种地址类型:

      1.first~setep

      first指起始匹配行,step指步长,例如sed -n 2~5p,从第二行匹配,隔5行匹配一次,即2,7,12,17...

      2.$

      $表示匹配最后一行。

      3./REGEXP/

      表示匹配正则那一行,通过//之间的正则来匹配。

      4.cREGEXPc

      表示匹配正则那一行,通过c和c之间的正则来匹配,c可以是任意一字符。

      5.addr1,add2

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

      6.addr,+N

      从addr这行到往下N行匹配,总共匹配N+1行

      sed的正则表达式:

        sed的正则表达式元字符:

        元字符     功能                示例          示例的匹配对象。

        ^        行首定位符              /^love/        匹配所有以love开头的行。

        $       行尾定位符              /love$/        匹配所有以love结尾的行。

        .       匹配除换行外的串个字符        /l..e/         匹配包含字符l、后跟两个任意字符、再跟字母e的行。

        *       匹配零个或多个前导字符        /*love/        匹配在零个或多个空格紧跟着模式love的行。

        []       匹配指定字符组内任意一字符      /[L]ove/        匹配包含love和Love的行。

        [^]       匹配不指定字符组内任意一字符     /[^A-KM-Z]ove/     匹配包含ove,但ove之前的那个字符不在A至K或M至Z间的行。

        &       保存查找串以便在替换串中引用     s/love/**&**/     符号&代表查找串。字符串love将替换前后各加了两个**的引用,即love变成**love**。

        x{m}     连续m个x               /o{5}/        匹配连续5个字母o。

    2.命令参数:

      -n 使用安静模式,在一般情况所有的STDIN都会输出到屏幕上,加上-n后只打印被sed特殊处理的行

      -e 多重编辑,且命令顺序会影响结果。

      -f 指定一个sed脚本文件到命令行执行

      -r sed使用扩展正则

      -i 直接修改文档读取的内容,不在屏幕上输出

    3.sed操作命令:

      sed操作命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址,sed就会处理输入的所有的行。

      命令          说明

      a           在当前行后添加一行或多行

      c           用新文本修改(替换)当前行中的文本

      d            删除行

      i           在当前行之前插入文本

      h            把模式空间里的内容复制到暂存缓存区

      H            把模式空间里的内容追加到暂存缓存区

      g            取出暂存缓存区里的内容,将其复制到模式空间,覆盖该处原有内容

      G            取出暂存缓存区里的内容,将其复制到模式空间,追加在该处原有内容

      I            列出非打印字符

      p            打印行

      n            读入下一输入行,并从下一条命令而不是第一条命令开始处理

      q            结束或退出sed

      r            从文件读取输入行

       !           对所选行以外的所有行应用命令

      s            用一个字符串替换另一个

      替换标志:

      g            在行内进行全局替换

      p            打印行

      w            将行写入文件

      x            交换暂存缓冲区与模式空间的内容

      y            将字符转换为另一字符(不能对正则表达式使用y命令)

    4.实例操作

      实例1:sed '/root/p' /etc/passwd

          sed -n '/root/p' /etc/passwd

      说明:

      默认情况下,sed把所有输入行都打印在变准输出上,如果在某一行匹配到root,sed就把该行另外打印一遍。当选项-n和命令p同时出现时,sed只打印选定内容的行。

      实例2:

      sed ‘3d’ /root/passwd

      sed '3,$d' /root/passwd

      sed '/root/d' /root/passwd

      说明:

      第2行被删除,第3行到最后一行被删除,包含root的行被删除,其余行被打印。

      实例3:

      sed ‘s/root/test/g’ /root/passwd      #全局替换将root替换成test,替换后的行和其他行均被打印

      sed -n 's/root/test/p' /root/passwd       #只打印替换后的行,只替换每行中首个root

      sed 's/[0-9][0-9]$/&.5/' /root/passwd      #将末尾两位数的行加上.5

      sed -n 's/root/test/gp' /root/passwd      #只打印替换后的行

      sed 's/(root)/1test/p' /root/passwd     #在圆括号里的模式root作为标签1保存在特定的寄存器中,替换的串可以通过1来引用它,则root将替换为roottest

      sed 's#root#test#g' /root/passwd        #使用#符号代替/符号作为分隔符

      实例4:

      sed -n '/root/,/dbus/' /etc/passwd       #打印root和dbus之间的所有行,如果root在dbus之后的行出现则打印从root到下一个dbus之间的行

      sed -n ’5,/dbus/‘ /etc/passwd         #打印第五行到dbus之间的所有行

      sed '/root/,/dbus/s/$/**cool**/' /etc/passwd    #将root到dbus之间的行尾加上**cool**

      实例5:

      sed -e ’1,3d‘ -e's/root/test/' /root/passwd   #多重编辑功能

      实例6:

      sed ’/^root /a Hello root‘ /root/passwd                 #以root开头的行,root行后需要加空格

      sed '/^root /i Hello root ---------------------' /root/passwd    #以root开头的行,root行前行加入一行Hello root 一行----------------------

      sed ’/^root /c Hello root ---------------------‘ /root/passwd    #修改缓存区中以root开头的行

      sed '/Hello / {n;s/world/Rootor/;}‘ /root/passwd             #将以命令未执行成功

      sed '/Hello /y/0/1/' passwd                        #将带有Hello行中的0换成1

    5.生产环境案例:

      sed 's/^ *//g' /root/passwd          #文件以空格开头的行,将空格去掉

      sed 's/^[0-9][0-9]//g' /root/passwd       #删除行首数字

  • 相关阅读:
    [安卓]AndroidManifest.xml文件简介及结构
    [网络技术][转]PPTP协议解析
    ubuntu 12.04 (64位)下安装oracle 11g过程及问题总结
    deb包制作(转)
    短信部分之PDU简介及其格式(转)
    Siemens3508手机AT指令发送短信的实验
    GDB中应该知道的几个调试方法【转陈浩】
    JLink间接烧写【转自armobbs】
    [转]Java事件处理机制- 事件监听器的四种实现方式
    asp.net验证码
  • 原文地址:https://www.cnblogs.com/skydragon/p/7102333.html
Copyright © 2011-2022 走看看