zoukankan      html  css  js  c++  java
  • sedsed 一个更好理解sed执行过程的工具

    官网:http://aurelio.net/projects/sedsed/    这个上面好多学习的资料 嘿嘿 留着慢慢看

    昨晚在看sed的具体执行过程,看到有hold space,pattern sapce,然后想看一下执行过程,就搜啊搜啊,搜到这个,以前就一直想有没有一个指令能追踪如何执行的

    大概根据官网和自己的理解记录一下,不过我觉得看官网的原文更好理解,如果文中有错误,希望能一起改正,嘿嘿

    一:下载安装sedsed,是用python写的一个脚本文件
    1) cd /bin
    2) wget http://aurelio.net/projects/sedsed/sedsed-1.0 -O sedsed   -O表示以另一个文件名保存
    3) chmod +x sedsed

    二:sedsed的几种模式               

              调试模式:它将会读取你的脚本并且添加额外的命令(就是:前面的信息);当你执行的时候也可看到命令之间的数据流,揭示其sed内部缓冲区神奇的面纱。通俗点讲就是把整个执行的过程显示出来,和set -x差不多
              缩进模式:脚本将会被标准的格式格式化。以一种标准的格式输出
              分词模式:把你执行的sed命令分析出来
              网页模式:你的脚本将被转换成一个美观的彩色的HTML格式,所有的命令和元素将会增强你的视觉乐趣
              有了sedsed,可以掌握任何的sed脚本,没有任何秘密了,没有更多隐藏的缓存。
    三:简单的几个例子           
    <1>:文本内容
    cat email.txt 
    user@abc.com
    otheruser@ll.com
    这里面有几个参数选项:可以用sedsed --help查看选项的意思          
                -d                      把调试模式打开                 
               HOLD:               HOLD SPACE的内容
               PATT:                PATTERN SPACE的内容
               COMM:              sed 执行的命令
               $:                     PATT与HOLD的结束符
               ...:                    不以任何标识符开头的是最终输出的结果
     
    --hide=hold        意思是把hold space这个输出以藏起来,因为在这个例子里是空的;这里需要对sed的pattern space和hold space要有理解
    cat email.txt |sedsed -d --hide=hold 's/@.*//g'
    PATT:user@abc.com$
    COMM:s/@.*//g
    PATT:user$
    user
    PATT:otheruser@ll.com$
    COMM:s/@.*//g
    PATT:otheruser$
    otheruser

     

    --hide=patt   就是把PATT:这个给隐藏起来,只会输出HOLD与COMM    

    cat email.txt |sedsed -d --hide=patt 's/@.*//g'
    HOLD:$
    COMM:s/@.*//g
    HOLD:$
    user
    HOLD:$
    COMM:s/@.*//g
    HOLD:$
    otheruser

     --hide=comm  就把COMM:隐藏,就只会输出HOLD,PATT

    cat email.txt |sedsed -d --hide=comm 's/@.*//g'
    PATT:user@abc.com$
    HOLD:$
    PATT:user$
    HOLD:$
    user
    PATT:otheruser@ll.com$
    HOLD:$
    PATT:otheruser$
    HOLD:$
    otheruser

     不加隐藏属性的话,PATT,HOLD,COMM都会对应的输出

    cat email.txt |sedsed -d 's/@.*//g'
    PATT:user@abc.com$
    HOLD:$
    COMM:s/@.*//g
    PATT:user$
    HOLD:$
    user
    PATT:otheruser@ll.com$
    HOLD:$
    COMM:s/@.*//g
    PATT:otheruser$
    HOLD:$
    otheruser
    这里的输出中有一个$符号,表示的是缓冲区的结尾。
     
    <2>:读取sed脚本
    cat email-linker.sed
    h;s|.*|<link>&</link>|;x;/@/{s/@.*/'s email:/;G;}
    sedsed --indent -f email-linker.sed
    h                                      
    s|.*|<link>&</link>|                   
    x                                      
    /@/ {                                  
        s/@.*/'s email:/                   
        G                                  
    }                        
    -f, --file           将sed脚本从一个文件里读取出来
    -i, --indent      将读取出来的复杂的sed脚本重新格式化成一种舒适的格式显示出来
     
    <3>
    echo lile@yunovo.cn |sedsed -d -f email-linker.sed 
    PATT:lile@yunovo.cn$
    HOLD:$
    COMM:h
    PATT:lile@yunovo.cn$
    HOLD:lile@yunovo.cn$
    COMM:s|.*|<link>&</link>|
    PATT:<link>lile@yunovo.cn</link>$
    HOLD:lile@yunovo.cn$
    COMM:x
    PATT:lile@yunovo.cn$
    HOLD:<link>lile@yunovo.cn</link>$
    COMM:/@/ {
    COMM:s/@.*/'s email:/
    PATT:lile's email:$
    HOLD:<link>lile@yunovo.cn</link>$
    COMM:G
    PATT:lile's email:
    <link>lile@yunovo.cn</link>$
    HOLD:<link>lile@yunovo.cn</link>$
    COMM:}
    PATT:lile's email:
    <link>lile@yunovo.cn</link>$
    HOLD:<link>lile@yunovo.cn</link>$
    lile's email:
    <link>lile@yunovo.cn</link>
    -d 把调试模式打开,-f 把sed脚本的内容读取出来去执行。从这个命令可以看到整个过程是如何执行的
     
    <4>:HTMLIZE
    把sed脚本已html形式显示出来
    sedsed --htmlize -f email-linker.sed >email-linker.sed.html

    然后在浏览器里,在对应的路径打开就可以看到彩色的输出,打开这个文件email-linker.sed.html,全是html的标签

    <5>分词模式,把一个sed命令分析
     sedsed -t 's/b/a/g'
        linenr:1
         addr1:
     addr1flag:
         addr2:
     addr2flag:
      lastaddr:
      modifier:
            id:s
       content:
     delimiter:/
       pattern:b
       replace:a
          flag:g
     extrainfo:
       comment:
     
  • 相关阅读:
    HTML5 文件处理之FileAPI简介整理
    HTML5 TypeArray和Unicode 字符之间转换
    HTML5 ArrayBufferView之DataView
    HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换
    JavaScript Unicode字符操作
    HTML5 类型数组TypeArray(一)
    HTML之Data URL(转)
    Wpf TextChanged事件导致死循环,事件触发循环问题
    JavaWeb学习笔记:ServletConfig()和ServletContext()
    Effective Java读书笔记
  • 原文地址:https://www.cnblogs.com/lemon-le/p/6061189.html
Copyright © 2011-2022 走看看