bash中一条管道命令的解释
来源:互联网 发布:winform 界面框架源码 编辑:程序博客网 时间:2024/05/22 15:58
最近在看《高级bash脚本编程指南》,书中提到一种去除c文件中注释的方法,其中一条核心的管道命令是:
sed -e "s%/\*%${WEIRD}%g;s%\*/%${WEIRD}%g" “$1” \ | tr '\377\n' '\n\377' \| sed -ne 'p;n' \| tr -d '\n' \| tr '\377' '\n'
其中 ${WEIRD}代表ascii字符\377,$1是输入进来的文件名。
初一看,百思不得其解,于是打算在终端中分步测试每一步的输出,经过一翻研究,我弄明白了每一行的意思。
测试的过程是这样的:
我首先用vi建立了一个c文件example.c,文件内容如下:
/* some comments here*/void main(){ some codes here. /* comments */}/* comments */void fun(){ some codes here.}
设置变量的值:
[root@www exp]# WEIRD=$'\377'
验证第一步的输出,结果是这样的:
[root@www exp]# cat example.c | sed -e "s%/\*%${WEIRD}%g;s%\*/%${WEIRD}%g" > 2.txt[root@www exp]# cat 2.txt� some comments here�void main(){ some codes here. � comments �}� comments �void fun(){ some codes here.}
验证第二步的输出,结果是这样的:
[root@www exp]# cat 2.txt | tr '\377\n' '\n\377' > 3.txt[root@www exp]# cat 3.txt� some comments here���void main()�{� some codes here. comments �}�� comments ��void fun()�{� some codes here.�}�
注意这里只是将\377和\n互换,不是正则表达式匹配。
接下来的第三步是最重要的一步:
[root@www exp]# cat 3.txt | sed -ne 'p;n' > 4.txt[root@www exp]# cat 4.txt��void main()�{� some codes here. �}����void fun()�{� some codes here.�}�
很神奇,所有带comments的行都去掉了,奥秘就在于sed的命令p和n。p命令打印一行后,n命令直接用下一行代替该行,因为注释行和非注释行是相间的,所以正好起到了想要的效果。
接下来的两步将代码还原:
[root@www exp]# cat 4.txt | tr -d '\n' > 5.txt[root@www exp]# cat 5.txt��void main()�{� some codes here. �}����void fun()�{� some codes here.�}�[root@www exp]# cat 5.txt | tr '\377' '\n' > 6.txt[root@www exp]# cat 6.txtvoid main(){ some codes here. }void fun(){ some codes here.}
这就是最后的c文件。
当然,这里只是处理一种最简单的情况,对于复杂的c语言代码,以上过程可能不会有理想的效果。
利用逐文件的管道分析法,可以了解管道的实际运行过程,十分有用。
0 0
- bash中一条管道命令的解释
- Bash Shell 的管道命令
- bash处理一条命令的步骤
- 为何bash中一条命令的输出保存到变量之后换行符变成了空格
- 一条命令实现bash和dash的转换
- Bash shell之管道命令
- 鸟哥的私房菜:Bash shell(六)-管道命令
- bash中 2>&1 & 的解释
- bash中 2>&1 & 的解释
- bash中 2>&1 & 的解释
- bash中 2>&1 & 的解释
- 14.bash中 2>&1 & 的解释
- bash中 2>&1 & 的解释
- bash中 2>&1 & 的解释
- bash中 2>&1 & 的解释
- bash中 2>&1 & 的解释
- 管道命令和xargs的区别(经典解释)
- 管道命令和xargs的区别(经典解释)
- switch入参:java中不可为long,C++中则可以
- SQLPLUS:AUTOTRACE是如何工作的
- 信息完整性
- C++ 隐式类型转换与关键字explicit
- 用artifactory搭建maven2内部服务器
- bash中一条管道命令的解释
- SharePoint 2010/2013 使用Javascript来判断权限的三种方法
- Maven学习 搭建多模块企业级项目 maven工程下包含多个maven工程(模块)--good
- FTP安装和虚拟用户的建立
- SQL纵向变成横向,横向变成纵向(经典案例添加自己的想法)
- ListView 实现数据列表
- adb shell下使用命令行删除android系统中指定文件和文件夹
- std::string to NSString?
- 网络聊天100句流行语(中英文对照)