码迷,mamicode.com
首页 > 其他好文 > 详细

sed小感悟

时间:2015-08-14 19:27:26      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:sed 调换奇偶行 pattern space holding sapce

小感一点

一、砖头勾引和田玉

    先说点自己对sed的目前掌控吧,sed是一个文本流编辑器,逐行处理文件。默认情况下并不直接改变原本文件内容(除非使用-i选项)。

    sed工作有两个空间pattern spaceholding space

    pattern spacesed逐行将文本行拿出,置于pattern space中,然后做相应处理,默认操作是对每一个经过pattern space的行做输出至屏幕操作(-n选择静默模式不打印pattern space中没有被打印的行,仅仅打印被匹配的行)。

    hold buffer空间,选用h操作就能将在pattern space中被匹配到的内容复制一份到hold buffer中并且覆盖原有hold buffer的记录。选用H操作就追加一行内容到hold buffer中,况且,每当使用H操作时,hold buffer默认会有一行的预留空间。

    能用sed实现奇偶行调换,也算是对sed有了中级认识,原理就像C语言实现两个变量互换值域一样,先将要调换的拿出来,放入另一个区域中,再做操作,然后再操作初始值。

例:用sed这样实现

#sed -e ‘1~2{h;d;}‘ -e ‘{G}‘ testfile

命令流程和操作过程如下图

技术分享

testfile文件

技术分享

用h操作

技术分享

用H操作

技术分享

二、记录下sed的通用格式和部分选项及其command

    sed [options] ‘[address]|[/pattern/][actions]‘ FILE

        address

            first~step 

            1,$

            /BRE1/,/BRE2/

        pattern /BRES/

        actions

            a \string

             i \string

            c \string

            h 将结果暂存于holding buffer

            G 调用holding buffer中的数据至pattern space中,再打印。
        [1,3]s ///

            r filename 把filename放置到匹配前面address或者pattern的后面

            q 找到地址后面就退出


    s/pattern/string/[g p w i]

        此命令只替换被模式匹配到的字符本身,要是替换整行用 /pattern/c \string

        g 默认只替换第一次被模式匹配到的内容,要全局修改用g

        p 打印该变动行

        i 忽略大小写去搜索

        w filename 重定向输出该行到制定文件夹。如‘s///w sed.out‘

#sed ‘s/\(l..e\)/\1r/g‘ sed.txt

若只将 love改为Love

#sed ‘s/l\(..e\)/L\1/g‘ sed.txt

将行首的至少一个空格字符删除

#history | sed ‘s#^[[:space:]]+##g‘


三、小点仅作自己记忆参考

小点一关于addresss

   first~step 从第一行开始,每两步匹配一次,或是说每两行执行一次后续操作,如下例,没两行执行一次{h;d},也就是说只有第一行被放入holding buffer,第二行执行默认操作(输出)。

例子

#sed -e ‘1~2{h;d;}‘ -e ‘{G;}‘ /etc/inittab


小点二、sed的替换用于修改字符串。

   这种情况通常是比较恶心的,尤其是锚定前后字符串的,比如把/etc/inittab 中id:3:initdefault中的冒号中间的数字换成5

方法一、(&)

#sed ‘s/l..e/&r/g‘ sed.txt

方法二、(后向引用)

#sed ‘1,$s/\(id:\)[0-9]\(:initdefault:\)/\15\2/g‘ /etc/inittab


小点三、sed脚本格式

#vim script.sed
    #!/bin/sed
    #name
    #replace the first line with a "hello" 
    1 c\ hello
    
    #replace the last line with a "hello"
    $ c\ hello
    
    #add "hello" upon which "evening" been matched.
    /eventing/ i\ hello
    
    #add "hello" after 3th line.
    3 a\ hello
    
#sed -f script.sed /etc/inittab

一点小见解,前面的关于sed引用空间的见解完全是自己摸索,但是不知道是否正确,恳请各位大牛多多指正。

本文出自 “我只想安静地奔跑” 博客,请务必保留此出处http://gumpping.blog.51cto.com/9811308/1684727

sed小感悟

标签:sed 调换奇偶行 pattern space holding sapce

原文地址:http://gumpping.blog.51cto.com/9811308/1684727

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!