4.13. 字符介绍——什么词?第一部分

未匹配的标注

4.13 字符介绍——什么词?第一部分

为方便测试,假设文件 sample3 的内容如下:

a book of selected poems.
The two books are extraordinary.
a bookish, untidy boy
a handbook of poisonous plants
stop actin booky, bruv
If you are a bookworm (literally), the book could be good for eating!

你可能已经发现了,有时要匹配一个完整的词是困难的。比如,如果我们想匹配模式 “book”,我们的搜索将会命中包含单词 “book” 和 “books” 还有 “bookish”,“handbook”,“booky” 这些行。很明显要限制匹配,就要用空格来包围 “book”。

□book□

然而,这个表达式将会只匹配单词 “book”;它将会错失 “books”。

image-20221024150930402

要匹配单词的单数和复数,你就要需要使用 * 元字符:

□books*□

这将匹配 “book” 和 “books”。

image-20221024151005070

然而,如果 “book” 后面跟着一个句号、,、 ? 或者引号,它将不会匹配 “book ”。

当你把 * 和通配符结合在一起的时候,你可以匹配任意字符的 0次到多次。在之前的例子中,我们可能写一个更完整的正则表达式如下:

□book.*□

image-20221024151051147

这个表达式匹配了字符串 “book” 接着任意数量的任意字符或者没有,再接着是一个空格,下面是一些匹配的行:

Here are the books that you requested
Yes, it is a good book for children
It is amazing to think that it was called a "harmful book" when
once you get to the end of the book, you can’t believe

(注意只有第二行会被这个固定的字符串 “book” 匹配。)这个 “□book.*□” 表达式匹配了包含这些单词比如 “booky”,“bookworm”,“bookish” 的行。我们可以使用一个不同的修饰符来消除这些匹配中的其中两个。 ? 是扩展元字符中的一部分,它匹配之前那个字符的 0 到 1 次出现。因此这个表达式:

□book.?□

image-20221024151246281

将会匹配 “book”,“books”,“booky”,但不会匹配 “bookish”,“bookworm”。要消除像 “booky” 这样的单词,我们不得不使用字符类来指定在那个位置我们想匹配的所有字符。而且,因为 ? 这个元字符在 sed 里面是不可用的,所以我们还是得使用字符类。就像我们之后看到的那样。

对于正则表达式来说,包括所有情况并不是永远实用的——特别是当使用 grep 的时候。有时保持表达式简单,允许一些遗漏是最好的。然而当你在 sed 里面使用正则表达式来进行替换的时候,你将不得不更加小心来确保你的正则表达式完整。我们随后将在本章的 “什么词?” 的第二部分中学习一个更完整的正则表达式用来搜索单词。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~