sed命令简介

简介:
1
2
3
4
文本处理三剑客:
     grep:egeep,fgrep:文本过滤器
     sed:stream Editor:流编辑器,逐行
     awk:文本格式化工具,报告生成器

    
一、sed简介

    sed一次从文件中读取一行,不会修改原文件的内容
    sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行)
    sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。
    处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。
    
        放在sed的工作空间:pattern space 处理-->模式匹配-->匹配(则编辑->根据编辑命令是否输出) //不匹配(stout)
        输出到-->stout
        
    可以基于正则表达式进行文本过滤
        把文件的
    文件行数据流:--->|pattern space|  //默认显示没有匹配到的行
                            v
                          /      \
                        No        Yes
                        |        /  \
                        |     /    edit
                        |   /        |
                        V/            Hold space 
                        stdout        
        
        //sed空间:空间可以转换
            pattern space 
            hold space //处理的结果
    sed [option] ... 'script' [input-file]...  //输入文件可以有多个
        script:地址定界+编辑命令
        OPtions:
            -n ,--quiet,--slient不输出模式空间的内容到屏幕
                suppress:压制,不让
            -e script, --expression=script //默认只有一个script,实现多点编辑
            -f script-file //脚本文件,每行一个编辑命令
            -r 支持扩展的正则表达式
            -i 直接编辑原文件
        地址定界:
            1.空地址,表示对全文进行处理
            2.单地址,
                # :指定行
                /pattern/ :被此模式匹配到的每一行
            3.地址范围
                #,# //起始地址
                #,+# //向后几行
                #,/pattern/  //到pattern模式匹配结束
                /pat1/,/pat2/   //斜线是默认的,必须有
            4.步进:~
                1~2 //所有的奇数行
                2~2 //所有的偶数行
        编辑命令:
            d 删除模式空间的内容
                sed '/^UUID/d' /etc/fstab //删除uuid开头的行
                sed '3d' /etc/fstab //删除第3行
                sed '1~2d' /etc/fstab  //显示偶数行,删除奇数行
            p 打印模式空间的内容
                sed '1~2p' /etc/fstab //模式空间显示两遍,
                        //偶数行没有被匹配,因此显示
                        //奇数行被匹配到,默认为显示
                        //edit后的操作是显示
                sed '1~2p' /etc/fstab -n //只显示奇数行,模式空间的内容
            a\test 追加 :在模式匹配到的行,下一行追加文本,支持使用,\n实现多行追加
                后面追加
            i\test:在行前面插入文本,支持使用\n实现多行插入
                sed '3i \new line' fstab.t //不匹配到的行,默认也为输出
                sed '3a \new line\nanother line' fstab.t //插入两行
                sed '/UUID/a \# add new device base on UUID' fstab.t //在每一行的UUID前面都加了信息
            c\text:把匹配到的行替换为此处指定的文本"text";
            
            主要: "/" 和 "\" 都可以使用
            
            w /PATH/TO/SOMEWHERE :保存模式空间匹配到的行至指定的文件中
                sed -n '/^[^#]/w /tmp/fsatb.test' fstab //把非#开头的行,保存到文件
            r /PATH/TO/SOMEFILE :读取指定文件的内容到当前文件被模式匹配到的行中
                sed '3r /etc/issue' fstab //在3行,读入issue的内容
                sed '/dev/r /etc/issue' fstab //匹配到的行,都读入issue文件内容
            = 为模式空间匹配到的行,打印行号
                sed '/dev/=' fstab
            ! 条件取反
                sed '/^#/!d' /etc/fstab //模式取反
            s/// :查找替换,其分隔符可自行指定,常用的分隔符,s##,s@@,s///等
                替换标记:
                    g:全局替换
                    w /PATH/TO/SOMEFILE:保存到指定文件
                    p:显示替换成功的行
                    
二、练习
    1.删除/boot/grub/grub2.cfg文件中所有以空白开头的行的行首的所有空白字符
    2.删除/etc/fstab文件中所有以#开头的行的行首的#号以及#号后面的空白字符
    3.输出一个绝对路径,取出其目录,其行为类似于dirname
        1.sed 's@^[[:space:]]\+@@' /etc/grub2.cfg 
        2.sed 's@^#[[:space:]]*@@' /etc/fstab
            sed 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab
        3.echo "/var/log/messages" | sed 's@[^/]\+$@@'
          echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'  //基本的正则表达式,\?需要转义:可有可无
          echo "/var/log/messages/" | sed -r 's@[^/]+/?$@@'    //扩展的正则表达式
        
三、高级编辑命令
        h H    Copy/append pattern space to hold space. p->h
        g G    Copy/append hold space to pattern space. h->p
            g:get
            大写的为追加,小写的为复制
        x:把两组空间互换,exchange
        n N    Read/append  the  next line of input into the pattern space.
        d 删除模式空间中的行
        D:删除多行模式空间中的行
        
    示例:
        sed -n 'n;p' /etc/fstab //显示偶数行,n为下一行,分号用于分割命令
        sed ‘1!G' /etc/fstab //除了第一行,都追加一行空白
        sed '1!G;h;$!d' /etc/fstab
                //覆盖模式空间到hold空间,最后一行不删除,其他都删除{删除模式空间的第几行}
                //逆序显示文件内容
        sed '$!d' /etc/fstab  //不是最后一行就删除
        sed '$!N;$!D’ file  //只显示最后两行
            $!N //不是最后一行,追加下一行到模式空间
                倒数第二行,追加最后一行后结束
            $!D //不是最后一行,都删除,
                倒数第二行的时候,追加的是最后一行,所以不删除
        sed '/^$/d;G' /etc/fstab //删除原有的所有空白行,而后为所有的非空白行,后添加一个空白行
        sed 'n;d' file //显示奇数行
        sed 'G' file //在每行后都追加一个空白行
    sed -i '/^UUID/d' fstab //在原有的文件上修改    
    
注意:任何时候,删除和修改的时候,先备份















本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1950194,如需转载请自行联系原作者

相关文章
|
8月前
|
Perl
sed命令的详解整理
sed命令的详解整理
616 2
|
Perl
inux 命令合集 文本处理和正则表达式相关命令之二
inux 命令合集 文本处理和正则表达式相关命令之二
83 0
inux 命令合集 文本处理和正则表达式相关命令之二
|
Perl 机器学习/深度学习 开发工具
|
监控 Shell Linux
sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 1.
1290 0
|
Perl 机器学习/深度学习