方括号中的短横线
通过在方括号中包括附加集合,您还可以搜索多个字符序列 。例如,若要搜索 a-z 和 A-Z,可以使用以下搜索:
grep g[a-zA-Z]lf
脱字号 (^)
当您的字符序列列表变得更长时,可能发现通过避免某些字符而不是指定想要查找的字符来进行搜索会更容易 。这可以通过在搜索序列前在方括号中使用脱字符 (^) 来实现 。这说起来挺复杂的,但是通过观察一个示例,应该是很容易理解的 。通过使用以下 grep 命令来更改您的搜索,以避免数字但是包括所有其他字符:
grep g[^0-9]lf
此搜索类似于前面查找所有字母字符的搜索,但是此搜索还返回诸如数字符号 (#) 和美元符号 ($) 等不属于字母并且也不在您排除的数字序列中的字符 。
星号
要试验的下一个特殊字符是星号 (*),它是若干个重复操作符之一 。大多数人都非常熟悉在命令行上使用星号作为文件名搜索条件(通配符),但是在正则表达式中使用星号还是相当新鲜的 。星号指示搜索项(前一个字符或方括号表达式)可以出现零次、一次或多次 。若要对此进行尝试,请将以下行添加到您已经在使用的 grep.txt 文件:
This time the o is missing in glf.
Some people might say goolf.
But they would not say goilf.
现在整个文件应该类似如下:
I like golf.
Golf is played on grass.
I created gilf.
What is g2lf?
This time the o is missing in glf.
Some people might say goolf.
But they would not say goilf.
尝试在 golf 中的 o 后面使用星号:
grep go*lf grep.txt
您的搜索将返回具有单词 golf、glf 和 goolf 的行:
I like golf.
This time the o is missing in glf.
Some people might say goolf.
问号
另一个重复操作符是问号 (?) 。问号的功能与星号类似,只不过搜索项可以出现零次或一次 。多个实例将不匹配 。使用问号取代星号来尝试您刚才执行的搜索:
grep go?lf grep.txt
可以看到,这次作为匹配结果返回了 golf 和 glf,但是没有返回 goolf,因为其中存在问号前的搜索项 o 的多个实例:
I like golf.
This time the o is missing in glf.
加号
最后一个常规重复操作符是加号 ( ) 。加号将查找某个搜索项出现一次或多次的情况 。与星号不同,必须至少找到一个实例才会匹配 。请尝试以下示例:
grep go lf grep.txt
这次,该搜索返回 golf 和 goolf,但它不返回 glf,因为没有找到 o:
I like golf.
Some people might say goolf.
行首和行尾定位点
在转向 sed 之前,最后要学习的特殊字符是行首定位点(使用脱字符来实现)和行尾定位点(使用美元符号来实现) 。您可能记得,您在本教程的前面使用过脱字符来对方括号表达式取反 。当在方括号之外使用脱字符时,它执行完全不同的功能 。将脱字符放在正则表达式开头将告诉该搜索仅操作行的开头 。换句话说,正则表达式中的第一个字符(脱字符之后)必须与新行上的第一个字符匹配才能匹配该行 。类似地,将美元符号放在正则表达式的结尾以指示您仅希望返回与行尾匹配的结果 。换句话说,正则表达式中的最后一个字符(美元符号之前)必须与某行上的最后一个字符匹配才能匹配该行 。若要对此进行测试,请将以下两行添加到 grep.txt:
golf has been a fine example
let's talk about something besides golf
请注意,对于此测试,您不应该对 golf 进行大写或加标点,因为它将演示一个针对同一单词的搜索,此搜索使用定位点在行尾或行首以不同的方式操作 。若要测试行首定位点,请输入以下命令:
推荐阅读
- UNIX 新手指南,第 2 部分: vi 文本编辑器
- UNIX 新手指南: 一些很好的 Shell 诀窍
- 使用 UNIX System V IPC 机制共享应用程序数据
- iphone11id设置
- 和大6小3的第一次接触
- 利用 UNIX 脚本来管理 DS4000 磁盘阵列系统
- 对话 UNIX,第 13 部分: 另外十种命令行组合
- UNIX 生产力技巧
- UNIX 新手指南,第 1 部分: 文件维护工具
- 使用 UNIX find 命令的高级技术