awk - 元字符

awk - 元字符

由一组括在括号中的字符组成的正则表达式称为字符类;它匹配任何一个封闭的字符。例如,[AEIOU]匹配任何字符AEIOU

可以使用连字符在字符类中缩写字符范围。紧邻连字符左侧的字符定义范围的开始;紧邻右侧的字符定义结束。因此,[0-9]匹配任何数字,并[a-zA-Z][0-9]匹配字母后跟数字。如果没有左操作数和右操作数,则字符类中的连字符表示其自身,因此字符类[+-][-+]匹配 a+或 a -。字符类[A-Za-z-]+匹配包含连字符的单词。

[+-]和 和有什么区别[-+]?在我看来,它也在做同样的事情。做什么呢[A-Za-z-]+

$ awk '/[Y-Zy-z-]/' countries
India     1267 746  -Asia
$ awk '/[Y-Zy-z-]+/' countries
India     1267 746  -Asia
U         8649 275  Asia
Canada    3852 25   North America
China     3705 1032 Asia
USA       3615 237  North America
India     1267 746  -Asia
Mexico    762  78   North America
France    211  55   Europe
Japan     144  120  Asia
England   94   56   Europe

或者我尝试过

awk '/[^-]/' countries

我没有期望任何输出。

$ awk '/[^-]/ countries
U         8649 275  Asia
Canada    3852 25   North America
China     3705 1032 Asia
USA       3615 237  North America
India     1267 746  -Asia
Mexico    762  78   North America
France    211  55   Europe
Japan     144  120  Asia
England   94   56   Europe

答案1

文本指出,要匹配括号-表达式 中的破折号, [...],破折号必须出现在 的第一个或最后[...](或紧接在首字母 后^,如[^-]匹配任何非破折号的单个字符)。

[+-]和之间没有区别[-+]。两者都匹配 a+或 a -

该表达式[A-Za-z-]+将匹配多个(大于零,因为在+后面[...])ASCII 字符 from AtoZ和 from atoz 和破折号。破折号也可以放在前面,如 中所示[-A-Za-z]+

请注意,该表达式中的内部两个破折号表示范围而最后一个破折号(或第一个破折号[-A-Za-z]+)表示字面破折号字符

after修改表达式+[...]使其匹配[...].如果没有+,表达式将精确匹配一个字符,而不是带有可选破折号的单词。


第二个屏幕截图显示您正在[Y-Zy-z-]匹配[Y-Zy-z-]+某些数据。

对于这两种模式,您会得到相同的结果,因为这是唯一包含集合中一个或多个字符的行YZyz-。匹配的字符就是-子字符串中的字符-Asia

然后你尝试使用[^-].这匹配于全部行,因为所有行都包含一些不是-.

相关内容