4

我遇到了在 Linux 中看不到的东西。谁能告诉我为什么第一个正则表达式没有选择“ß-胡萝卜素”?

$ cat cmpg
ß-Cyclopentyl-4-(7H-pyrrolo[2,3-d]pyrimidin-4-yl)-((3R)-1H-pyrazole-1-propanenitrile
ß-Cyclopentyl-4-(7H-pyrrolo[2,3-d]pyrimidin-4-yl)-((R)-1H-pyrazole-1-propanenitrile
ß-carotene  

$ cat cmpg|awk  '/[^\w\s({)}\r\n\[\]],/'
ß-Cyclopentyl-4-(7H-pyrrolo[2,3-d]pyrimidin-4-yl)-((3R)-1H-pyrazole-1-propanenitrile
ß-Cyclopentyl-4-(7H-pyrrolo[2,3-d]pyrimidin-4-yl)-((R)-1H-pyrazole-1-propanenitrile

cat cmpg|awk  '/ß/'
ß-Cyclopentyl-4-(7H-pyrrolo[2,3-d]pyrimidin-4-yl)-((3R)-1H-pyrazole-1-propanenitrile
ß-Cyclopentyl-4-(7H-pyrrolo[2,3-d]pyrimidin-4-yl)-((R)-1H-pyrazole-1-propanenitrile
ß-carotene

谢谢您的帮助!

4

2 回答 2

8
$ cat cmpg|awk  '/[^\w\s({)}\r\n\[\]],/'

仅匹配至少包含一个逗号的行。

至于为什么否定字符类匹配2(这让我感到困惑,因为\w包含所有ASCII数字,因此[^\w...]应该无法匹配2):awk使用不知道\w(或 \s)速记的POSIX基本正则表达式。您需要使用[:alnum:]or[:space:]代替。

总而言之,该正则表达式在任何正则表达式风格中都很奇怪你想用它来达到什么目的?

于 2013-06-17T14:48:28.417 回答
3
$ cat cmpg|awk  '/[^\w\s({)}\r\n\[\]],/'

查找具有 2 个字符的任何字符串:

  • 第一个字符不应该 ( [^) 是:

    • \w: 一个“单词”字符(数字、字母数字和下划线)
      • w如果 awk 版本不知道\w特殊含义,则为文字
    • \s: 一个空格(如果使用 unicode,可能是很多东西,而不仅仅是空格和制表符)
      • s如果 awk 版本不知道\s特殊含义,则为文字
    • ( : 一个(
    • { : 一个{
    • ) : 一个)
    • } : 一个}
    • \r: 换行
    • \n: 换行
    • \[: 一个[
    • \]: 一个]
  • 第二个字符必须是:

    • ,:一个,(逗号)。

最后一行不包含逗号。(否则,Beta 将匹配,因为它不属于上述列表)

于 2013-06-17T15:01:04.217 回答