sedsed 一个更好理解sed执行过程的工具

时间:2022-05-16 15:30:56

官网: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:\n<link>lile@yunovo.cn</link>$
HOLD:<link>lile@yunovo.cn</link>$
COMM:}
PATT:lile's email:\n<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的标签

sedsed 一个更好理解sed执行过程的工具

 

<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: