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:\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的标签
<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: