6.4 匹配控制字符

如何匹配控制字符呢?虽然你很少会在文本中查找控制字符,但知道如何做也不是件坏事。在示例代码库中,你会找到ascii.txt文件(共128行),包含了所有的ASCII字符,一个字符占一行(所以有128行)。当你在该文件中查找时,若找到匹配项就返回一行。这个文件用来试试手挺不错的。

如果你使用grep或ack在ascii.txt中查找字符串或控制字符,这两个程序可能会将该文件当做二进制文件。如果是这样,在对其执行一个脚本时,若找到匹配程序就会报告“Binary file ascii.txt matches”(二进制文件匹配成功)。就这一点需要注意。

在正则表达式中,可以像这样来指定一个控制字符:

  1. \cx

其中x就是你想匹配的控制字符。

例如,要在一个文件中查找空字符,可以使用以下Perl命令:

  1. perl -n -e 'print if /\c@/' ascii.txt

如果系统中已经安装了Perl且运行正常,就可以得到以下结果:

  1. 0. Null

原因是该行有一个空字符,只是结果中看不到这个字符。

如果你用vim之外的编辑器打开ascii.txt文件,编辑器就有可能将控制字符从文件中删除,所以最好还是使用vim编辑器。

还可以用\0来查找空字符。试一下这个命令:

  1. perl -n -e 'print if /\0/' ascii.txt

再用以下命令来查找报警字符(BEL):

  1. perl -n -e 'print if /\cG/' ascii.txt

这将返回:

  1. 7. Bell

或者还可以使用简写式:

  1. perl -n -e 'print if /\a/' ascii.txt

要查找转义字符,则使用:

  1. perl -n -e 'print if /\c[/' ascii.txt

它的结果是:

  1. 27. Escape

或者使用简写式:

  1. perl -n -e 'print if /\e/' ascii.txt

如何匹配退格符呢?试一下这个:

  1. perl -n -e 'print if /\cH/' ascii.txt

它显示:

  1. 8. Backspace

也可以使用分类表达式来查找退格符:

  1. 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] 退格符

该表总结了本章的内容。下一章我们详细学习量词。