用正则表达式修改目标
并非所有的正则表达式工具都允许你修改目标字符串,它们中的一些仅仅使用正则表达式来查找匹配指定模式的字符串,在Linux中,最为广泛使用的支持正则表达式的工具就是grep命令,这是一个专门用来查找的工具,再就是一些文本编辑器工具,它们有的允许使用正则表达式替换,有的则不允许,这需要查看你使用的工具的在线手册。
对于那些允许你使用正则表达式来修改目标字符串的工具中,它们之间的一些不同你必然放在心上:
这些不同首先表现在替换的具体形式上,有的是以对话框的形式分别让你输入需要查找的模式和被替换的内容,有些则使用命令使界面通过定界符来分隔匹配的模式与需要替换的内容,对于一些编程语言工具,它们通常通过函数的不同参数来分别定义需要匹配的模式与替换的内容。
另一个需要注意的不同是这些工具具体修改的对象。大多数基于Linux的命令行工具一般是通过标准输出或者管道来修改缓存的内容而非直接修改磁盘上存储的文件,而文本编辑器工具或编程语言通常会直接修改目标文件。
我们下面用Linux下sed命令的格式来举几个正则表达式的例子:
模式:s/cat/dog/g
输入:wild dogs, bobcats, lions, and other wild cats
输出:wild dogs, bobdogs, lions, and other wild dogs
模式:s/[a-z]+i[a-z]*/nice/g
输入:wild dogs, bobcats, lions, and other wild cats
输出: nice dogs, bobcats, nice, and other nice cats
当我们使用模式进行替换操作时,目标字符串中所有匹配模式的字符串都将被替换。
下面再举一个使用逆向引用进行替换的例子:
模式:s/([A-Z])([0-9]{2,4}) /\2:\1 /g
输入: A37 B4 C107 D54112 E1103 XXX
输出: 37:A B4 107:C D54112 1103:E XXX
前面已经介绍过默认情况下的匹配一般是greedy的,这常会使实际匹配的部分大于你希望匹配的内容,特别是在进行替换操作时这将更加危险,因为如果你在错误匹配的情况下执行了一次替换操作,实际上你是删除了目标中的有效内容,特别是当这种操作面向文件时造成的危害就更大了。因此,牢记一个不严格的字符类加上一个不严格的量词足以造成不可挽回的后果,执行类似操作前一定要多测试一下不同的目标字符串,尽可能避免这种情况的发生。
在本教程的下一篇文章里,我们会介绍一款可以方便进行正则表达式学习的工具和一些正则表达式编写的思路。