zoukankan      html  css  js  c++  java
  • sed--行编辑器命令

    2017-11-02

    sed:行编辑器,按行处理;默认不做原文件修改,会在sed自身的模式空间中按行读相关的数据并完成编辑,然后显示到屏幕上
     
     

    一.     基本用法:

    1. 语法格式:

    sed [option]... 'script'  文件名,其中script = '编辑位置+编辑命令'    注意:编辑位置要紧跟着编辑命令,中间没空格

     
                    
     2.  option选项(sed后面跟的参数,比如sed -n...)
                    -n:默认输出文件全部内容,加上-n就不会输出,可用于控制输出,一般和编辑命令p一起用,比如sed -n '3,5p'  1.txt    输出1.txt的3-5行;
                    -e: 多点编辑,用于一条命令中执行多个编辑操作;
                    -f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本;
                    -r: 支持使用扩展正则表达式;
                    -i: 直接修改文件内容;
     
      
    3.     编辑位置选定:
                    (1) 不给位置:对全文进行处理;
                    (2) 单位置:
                        #: 指定的行,比如5表示第5行
                        /pattern/:被此处模式所能够匹配到的每一行;
                    (3) 位置范围:
                         

                    (4) 正则表达式匹配

                          

     4.    编辑命令:
                    d:删除,例如删除空白行sed '/^$/d' file;删除文件最后一行sed '$d' file
                    p:显示模式空间中的内容
                    a text:在指定行的下一行追加文本,text表示要加入的文本信息;支持使用 实现多行追加
                                 其中a和之间有没空格都可以,经验证不要也行,下面的同理
                                 比如:sed '/^UUID/a hello,world. welcome' /etc/fstab---在以UUID开头的行后面追加hello,world和 welcome两行信息                                       
                    i text:在行前面插入文本;支持使用 实现多行插入;
                    c text:替换行为单行或多行文本为指定的信息,比如sed '/^UUID/c hello,world. welcome' /etc/fstab;
                    w保存模式空间匹配到的行至指定文件中;
                          比如sed '/^UUID/w /tmp/fstab.txt' /etc/fstab, 把etc/fstab以UUID开头的行,存到/tmp/fstab.txt中               
                    r:读取指定文件的文本流至模式空间中匹配到的行的行后;
                         例如:sed '6r /etc/issue' /etc/fstab----把/etc/issue中的内容写到/etc/fstab文件的第6行后面                   
                    =:为模式空间中的行打印行号; sed '/^UUID/=' /etc/fstab 打印匹配到以UUID开头的行号
                    !:取反条件; 例如 sed '/^UUID/!d' /etc/fstab   ---删除不是以UUID开头的行
                    s///:支持使用其它分隔符,s@@@,s###;--查找替换; 例如:sed 's#^UUID#uuid#' /etc/fstab
     
     
                        替换标记:
                            1)g: 行内全局替换,比如sed 's/girl/girls/g' file ;会替换每一行的所有匹配
     
                            2) 当需要从第N处匹配开始替换时,可以使用 /Ng
                                  echo sksksk | sed 's/sk/SK/2g'
                                  skSKSK
                            3)如只想替换第N处匹配,需要用/N
                                  <body>hello the world! <body>中,把第2个body替换为</body>,所在的文件为test.txt
                                 sed -r 's#(body)#/&#2' test.txt                       
     
                            4)p: 显示替换成功的行;
     
                            5)w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
             
           例子:          
     
                1)删除/boot/grub/grub.conf文件中所有以空白开头的行行首的空白字符;(centos7)
                        sed 's#^[[:space:]]+##' /etc/grub2.cfg
     
                2)删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符;
                        sed 's@^#[[:space:]]+@@' /etc/fstab           
                       
                3)在/etc/profile的最后一行附加两行文本name=hong;intro=hello,$name,如果不想使变量生效,用单引号,想立刻生效用双引号。
                        sed -i '$a ame=hong intro=hello,$name' /etc/profile
       
     
                  
    5.   sed元字符集
     
           ^              匹配行开始,如:/^sed/匹配所有以sed开头的行。
           $              匹配行结束,如:/sed$/匹配所有以sed结尾的行。
           .               匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
           *               匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
           []             匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
           [^]           匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
           (..)         匹配子串,保存匹配的字符,如s/(love)able/1rs,loveable被替换成lovers。
           &               保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
           <             匹配单词的开始,如:/<love/匹配包含love开头的单词的行
           >             匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
           x{m}     重复字符x,m次,如:/0{5}/匹配包含5个0的行。
           x{m,}    重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
           x{m,n}  重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。
     
     
          说明
    •         (..)的例子,匹配某一段字符串这里的其实是转义字符,默认sed不支持扩展正则表达式,如果用sed -r的话,转义字符可省去
     
                        1) echo this is digit 7 in a number | sed 's#digit ([0-9])#1#'      
                              输出: this is 7 in a number
       
                              命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,(..) 用于匹配子串,对于匹配到的第一个子串就标记为 1,依此类推匹配到的第二个结果就是 2,例如:
                       
                        2) echo aaa BBB | sed 's/([a-z]+) ([A-Z]+)/2 1/'
                               输出:BBB aaa
     
                        3) love被标记为1,所有loveable会被替换成lovers,并打印出来:sed -n 's/(love)able/1rs/p' file


    •         关于&的例子
     
                        1)正则表达式 w+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:
                             echo this is a test line | sed 's/w+/[&]/g'
                             输出:[this] [is] [a] [test] [line]
     
                        2)所有以192.168.0.1开头的行都会被替换成它自已加localhost:
                              sed 's/^192.168.0.1/&localhost/' file
                              输出:192.168.0.1localhost
     
     
    6.     高级编辑命令:
                        h: 把模式空间中的内容覆盖至保持空间中;(在模式空间中编辑,保持空间保存未编辑好的半成品数据,以便后面再处理)
                        H:把模式空间中的内容追加至保持空间中;
                        g: 从保持空间取出数据覆盖至模式空间;
                        G:从保持空间取出内容追加至模式空间;
                        x: 把模式空间中的内容与保持空间中的内容进行互换;
                        n: 读取匹配到的行的下一行至模式空间;(模式空间中只有匹配行的下一行,覆盖了匹配到的行)
                        N:追加匹配到的行的下一行至模式空间;(有2行)
                        d: 删除模式空间中的单行;
                        D:删除模式空间中的所有行;
     
                        几个例子:
                        sed -n 'n;p' FILE:显示偶数行   ---多个处理命令用分号隔开
                        sed '1!G;h;$!d' FILE:逆向显示文件内容-----
                        理解:1!表示第一行除外,$表示最后一行,!$表示除了最后一行,每一行都要执行这3个命令,然后才处理下一行,sed会首先读取一行到模式空间,然后执行这3个命令
                        sed '$!N;$!D' FILE: 取出文件后两行;
                        sed '$!d' FILE:取出文件最后一行;
                        sed 'G' FILE: 每一行后面追加一个空白行
                        sed '/^$/d;G' FILE: 如果是空白行,删掉,在后面再加一个空白行;表示把多个空白行合并为1个
                        sed 'n;d' FILE: 显示奇数行;
                        sed -n '1!G;h;$p' FILE: 逆向显示文件中的每一行;
                        sed '/test/{ n; s/aa/bb/; }' file  如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:
                        sed '1,10y/abcde/ABCDE/' file   把1~10行内所有abcde转变为大写,y表示翻译,注意,正则表达式元字符不能使用这个命令:

  • 相关阅读:
    前端之CSS盒模型介绍
    前端之CSS列表及背景类属性
    前端之CSS字体和文本类属性
    流程控制语句
    前端之CSS语法及选择器
    前端之CSS创建的样式
    前端之HTML语法及常用标签
    前端之HTML样式
    网页制作之前端简介
    jQuery(一)、核心
  • 原文地址:https://www.cnblogs.com/regit/p/7772792.html
Copyright © 2011-2022 走看看