6.4 匹配控制字符
如何匹配控制字符呢?虽然你很少会在文本中查找控制字符,但知道如何做也不是件坏事。在示例代码库中,你会找到ascii.txt文件(共128行),包含了所有的ASCII字符,一个字符占一行(所以有128行)。当你在该文件中查找时,若找到匹配项就返回一行。这个文件用来试试手挺不错的。
如果你使用grep或ack在ascii.txt中查找字符串或控制字符,这两个程序可能会将该文件当做二进制文件。如果是这样,在对其执行一个脚本时,若找到匹配程序就会报告“Binary file ascii.txt matches”(二进制文件匹配成功)。就这一点需要注意。
在正则表达式中,可以像这样来指定一个控制字符:
\cx
其中x
就是你想匹配的控制字符。
例如,要在一个文件中查找空字符,可以使用以下Perl命令:
perl -n -e 'print if /\c@/' ascii.txt
如果系统中已经安装了Perl且运行正常,就可以得到以下结果:
0. Null
原因是该行有一个空字符,只是结果中看不到这个字符。
如果你用vim之外的编辑器打开ascii.txt文件,编辑器就有可能将控制字符从文件中删除,所以最好还是使用vim编辑器。
还可以用\0
来查找空字符。试一下这个命令:
perl -n -e 'print if /\0/' ascii.txt
再用以下命令来查找报警字符(BEL):
perl -n -e 'print if /\cG/' ascii.txt
这将返回:
7. Bell
或者还可以使用简写式:
perl -n -e 'print if /\a/' ascii.txt
要查找转义字符,则使用:
perl -n -e 'print if /\c[/' ascii.txt
它的结果是:
27. Escape
或者使用简写式:
perl -n -e 'print if /\e/' ascii.txt
如何匹配退格符呢?试一下这个:
perl -n -e 'print if /\cH/' ascii.txt
它显示:
8. Backspace
也可以使用分类表达式来查找退格符:
perl -n -e 'print if /[\b]/' ascii.txt
如果没有括号,\b
会被认为是什么呢?是第2章中所学到的单词边界。括号改变了正则表达式处理器对\b
的理解方式。在本例中,Perl将其看做一个退格符。
表6-3 列出了本章中匹配字符的方法
表6-3 匹配Unicode及其他字符
代码 | 描述 |
---|---|
\uxxxx | Unicode(四位) |
\xxx | Unicode(两位) |
\x{xxxx} | Unicode(四位) |
\x{xx} | Unicode(两位) |
\ooo | 八进制(基数为8) |
\cx | 控制字符 |
\0 | 空字符 |
\a | 报警符 |
\e | 转义符 |
[\b] | 退格符 |
该表总结了本章的内容。下一章我们详细学习量词。