• Linux命令:sed命令


      sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

      功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

    格式:

           sed [options] 'script'  FILE ...

    options

      -n:静默模式,不输出模式空间中的内容,一般编辑命令p打印一起用

      -r:扩展的正则表达式

      -f:/path/to/sed_script_file:指定sed脚本文件,和-e效果一样

      -e 'script' -e 'script':指定多个编辑指令,前后script都要加-e

      -i:直接编辑原文件

      -i.bak  做备份后直接修改.bak这个后缀可以自定义如.backup| -i.back_`date +%F`

    script

      地址定界

        1)startline,endline

          1,3  1到3行

          1,$  1到最后一行

          1,+10   1向后10行

          1,/pat1/   1到pat1匹配行

          1~2        第一行开始,步径2,相当于显示奇数行

          2~2        第二行开始,步径2,相当于显示偶数行

        2)/pat1/,/pat2/ #从模式1-模式2的所有行

        3)/parttern/   #被模式匹配到的所有行,此处/不能替换成其他符号

        4)不给地址,对全文处理

      编辑命令

        d:删除

        p:打印,显示模式空间中被匹配到的内容,一般和-n一起使用,与d命令效果相反

        i ext:在匹配行前面插入一行text信息,支持 实现多行,也可以省略,如果要加空格不能省略

        a ext:在匹配行后面插入一行test信息,支持 实现多行

        c ext:替换符合条件行为单行或多行文本

        r /path/to/somefile:把另外一个文件的内容插入匹配到行的下面一行

        w /path/to/somefile:将符合条件的所有行保存至指定的文件中

        =:显示符合条件行的行号

        !:取反条件,在编辑命令之前添加!,如!d !p

      sed查找替换

        格式:sed '地址定界s/查找条件/替换文本/' file

        s///:查找条件可以使用模式,但是要替换的内容不行s@@@|s###|s%%%|s&&&,大多数符号都可以

          s///g:行内所有匹配项都进行替换

          s///i:ignore-case,不区分字符大小写

          s///w: /path/to/somefile

        注意:

        1、进行替换的时候不要加-n选项,和p打印选项。-n会清空其他内容。p打印选项会复制匹配到的内容

        2、替换内容如果引用变量需要使用三个'如:s@xxxx@'''$LANG'''@    

    举例

    1、开头行上方插入行
    # sed '/^#/i \' /etc/fstab          # 插入1行空行
    # sed '/^#/i \n' /etc/fstab        # 插入2行空行
    # sed '/^#/i \n
    ' /etc/fstab     # 插入3行空行
    
    2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为3
    # sed 's@(id:)[0-9](:initdefault)@132@' /etc/inittab
    
    3、删除/etc/init.d/functions文件中的空白行
    # sed '/^$/d' /etc/init.d/functions
    
    4、删除/etc/inittab文件中位于首行的#
    # sed 's@^#@@' /etc/inittab
    
    5、删除/etc/rc.d/rc.sysinit文件中以#后跟至少一个空白字符开头的行的行首的#和空白字符
    #sed 's@^#[[:space:]]1{1,}@@g' /etc/rc.d/rc.sysinit
    
    6、删除/boot/grub/grub.conf文件中首行的空白字符
    #sed 's@^[[:space:]]{1,}@@' /boot/grub/grub.conf
    
    7、取出一个文件路径的目录名称,如/etc/sysconfig/network,其目录为/etc/sysconfig,功能类似dirname命令
    echo /etc/sysconfig/network | sed 's@[^/]{1,}/?$@@'
    
    8、从第10行到最后一行加上开头#
    # sed '10,$s/^/#/' XXXX.txt
    
    9、把一行中的多个空格变成一个空格
    #sed  's@[[:space:]]{1,}@ @g' xxxx.txt

    sed高级用法

      前面基本用法中也有提到模式空间,即为处理文件中一行内容的一个临时缓冲区。处理完一行之后就会把模式空间中的内容打印到标准输出,然后自动清空缓存。而这里说的保持空间是sed中的另外一个缓冲区,此缓冲区正如其名,不会自动清空,但也不会主动把此缓冲区中的内容打印到标准输出中。而是需要以下sed 命令进行处理:

      高级编辑命令:

        p:打印模式空间开端至

        h:把模式空间中的内容覆盖至保持空间

        H:把模式空间中的内容追加至保持空间中

        g:从保持空间取出数据覆盖至模式空间

        G:从保持空间取出内容追加至模式空间

        x:把模式空间中的内容与保持空间中的内容进行互换

        n:读取匹配到的行的下一行至模式空间

        N:追加匹配到的行的下一行至模式空间

        d:删除模式空间中的行

    D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

    举例

    1、显示偶数行
    # sed -n 'n;p' FILE
    
    2、显示奇数行          
    # sed 'n;d' n.txt       
    
    3、倒叙显示    
    # sed '1!G;h;$!d' FILE    
    # sed -n '1!G;h;$p' FILE    
    
    4、取出文件后两行
    # sed '$!N;$!D' FILE        
    # sed 'N;$!D' FILE         
    
    5、取出文件最后一行
    # sed '$!d' FILE            
    
    6、在每一行后面都加入空白行
    # sed 'G' FILE
    
    7、把多个空行删掉,每行后面加一空行
    # sed '/^$/d;G'FILE         
  • 相关阅读:
    《CLR.via.C#第三版》第二部分第6,7章节读书笔记(三)
    《CLR.via.C#第三版》第二部分第4,5章节读书笔记(二)
    《CLR.via.C#第三版》第一部分读书笔记(一)
    https ssl
    bower 代理
    哦?
    Gulp 相关
    Edge浏览器的几个创意应用
    软件中英对照
    Windows 10 Mobile 演示:插入耳机自动执行 APP
  • 原文地址:https://www.cnblogs.com/ysuwangqiang/p/11444004.html
Copyright © 2020-2023  润新知