• 流编辑器sed知识点总结


    sed(流文本编辑器)
        每次读取一行到模式空间中,
        修改的sed模式空间中的内容,并不会修改源文件,
        继而输出模式空间的内容,
        最后删除模式空间中的内容。

        sed [OPTION]... [SCRIPT] [INPUTFILE...]
            -r: 使用扩展的正则表达式
            -n, --quiet, --silent: 不输出模式空间的内容
                例:sed -n '1d' test
                        命令执行过后是空白的,因为不输出模式空间中的内容
                       
            -i: 直接编辑原文件
            -e: -e '' -e '' -e ''
                'CMD1;CMD2;CMD3'
                例:sed -e '1d' -e '2p' test
                        连续执行两条命令,删除第一行,第二行输出两遍
                    sed '1d;2p;3=' test
                        连续执行三条命令
                       
            -f /path/to/sed_script: 从指定的文件读取处理脚本
                例:1d;2p;3=
                    sed -f 脚本文件 要处理的文本
           
        地址定界:
            #(行号):指定行
                例:sed '1d' test
                        删除第一行                   
                    sed '1,10d' /etc/passwd
                        第一行到第十行执行删除命令,即删除前10行
           
            $: 最后一行
                例:sed '$d' test
                        删除最后一行
           
            /regexp/: 任何能够被regexp匹配到的行
                例:sed '/dev/d' test
                        删除包含dev的行
                       
            \%regexp%: 任何能够被regexp匹配到的行,换用%为边界符,边界符是可以被替换的
                例:sed '\%/dev/mapper%d' test
                    sed '@/dev/mapper@d' test
                    sed '#/dev/mapper#d' test
                        删除包含/dev/mapper的行
           
            /regexp/I: 匹配时忽略大小写
                例:sed '/dev/Id' test
                        删除包含dev的行,同时忽略大小写
           
            addr1,addr2:指定范围内的所有行
                0,/regexp/
                #(行号),#(行号)
                /regexp/,/regexp/
                #(行号),+#(行号)
                first~step: 指定起始位置,以及步长1~3
               
                例:sed '1,+2d' test
                        删除第1行及其后边两行,即从第四行开始打印
                    sed '1~2d' test
                        从第一行开始删除,且之后间隔两行的也被删除
       
        基本正则表达式元字符:
            字符:.[] [^]
            次数:* + ? {i,j}
            分组:()
            锚定:^ $ < >
            或者:|
            后向引用:1 2
       
        编辑命令:
            注意:命令之前可以使用!表示取反操作
                例:sed '1~2!d' test
                        不删除匹配行
           
            =:显示行号
                例:sed -n '\%/dev/mapper%=' test
                        只显示包含/dev/mapper行的行号,不显示内容
                       
            d: 删除匹配到的行
            p: 打印模式空间中的内容
                通常与-n选项一同使用
                例:sed -n '5,7p' test
                        只打印第5,6,7三行
                   
                    sed '5,7p' test
                        会打印整个文件,但同时第5,6,7行会被打印两遍
            a ext: 追加字符
                例:sed '1a bb' test
                        在第一行后边追加bbb
                       
            i ext:插入文本
                i ext1 text2 text3 插入多行文本
            c ext:change,把匹配到的行替换为给定的文本,替换整行
                例:sed '3c bb' test
                    把第三行替换为bbb
                   
            s/*/*/: 替换命令
                g: 全局替换
                i: 不区分大小写
                例:sed 's/dev/etc/' test
                        替换dev为etc,且只会替换每行中的第一个dev
                   
                    sed 's/dev/etc/g' test
                        全局替换dev为etc
       
        练习1:删除/boot/grub/grub.conf文件中所以空白开头的行行首的空白;
           
            sed 's/^[[:space:]]+//g' /boot/grub/grub.conf
                解析:^[[:space:]]+ 是正则表达式
                        ^ 行首锚定
                        + 匹配其前面的字符至少一次
                       
        练习2:删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;
            sed 's/^#[[:space:]]+//' /etc/fstab
           
        练习3:echo一个文件路径给sed命令,取出其基名;取出其目录名;
            # echo "/etc/sysconfig/" | sed 's@[^/]{1,}/?$@@g'

        练习4:替换/etc/inittab文件“id:数字:initdefault:”一行中的那个数字为6;
            # sed 's@id:[0-9]:initdefault:@id:6:initdefault@' /etc/inittab


            高级编辑命令:
                h: 用模式空间中的内容覆盖保持空间中的内容;
                H:把模式空间中的内容追加至保持空间;
                g: get, 从保持空间取回数据至模式空间,覆盖模式空间中原有的内容;
                G:GET, 从保持空间取回数据至模式空间,追加于模式空间中现有的内容后面;
                x: 把模式空间和保持空间中的内容进行交换;
                n: 读取匹配到的行下一行至模式空间;
                N: 追加读匹配到的行下一行至模式空间;
                d: 删除模式空间中的内容;
                D:删除多行模式空间中首行;

            例:sed '1!G;h;$!d' FILE
                    执行结果:从行尾到行首,逐行输出
                    先取第一行,判断,是第一行,所以不执行G命令,执行h命令,判断,不是最后一行,执行d
                    读取第二行,判断,不是第一行,执行G命令,执行h命令,判断,不是最后一行,执行d
                    读取第三行,判断,不是第一行,执行G命令,执行h命令,判断,是最后一行,不执行d

            显示文件的偶数行:sed -n 'n;p' FILE;     sed -n '2~2p' FILE
                1
                2
                3
                4

            显示文件的奇数行:sed -n 'p;n' FILE;     sed -n '1~2;p' FILE

        练习:用sed将文件的奇数行与偶数行合并为一行,中间用“&&”隔开;
            # sed '$!N;s@ @&&@g' /etc/issue

        练习:说明以下sed命令的意义:
            (1) sed '$!N;$!D' /etc/issue
            (2) sed '$!d' /etc/issue
            (3) sed 'G' /etc/issue
            (4) sed '/^$/d;G' /etc/issue
            (5) sed 'n;d' /etc/issue
            (6) sed -n '1!G;h;$p' /etc/issue

    可以参考如下博客,讲的很详细:

    http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html

  • 相关阅读:
    .NET应用架构设计—工作单位模式(摆脱程序代码的重要思想,反击DDD)
    ext Window点击右上角的关闭(Xbutton)加入监控事件
    HDU 2008 数字统计
    HTML5 CSS3 精美案例 : 达到VCD盒个性幻灯片
    Oracle表操作 (未完待续)
    oracle 统计语句 与常见函数的归纳(未完待续)
    Oracle 存储过程的创建,及触发器调用存储过程
    Oracle 数据乱码
    按列合并结果集
    Struts2 全局结果集-全局result节点设置,package设置abstract=true的实现
  • 原文地址:https://www.cnblogs.com/yajing-zh/p/4878263.html
Copyright © 2020-2023  润新知