zoukankan      html  css  js  c++  java
  • 流编辑器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

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/yajing-zh/p/4878263.html
Copyright © 2011-2022 走看看