Regex linux正则表达式匹配chracter和xDF;

Regex linux正则表达式匹配chracter和xDF;,regex,linux,Regex,Linux,我遇到了在Linux中看不到的东西。有谁能告诉我为什么第一个正则表达式没有提取“ß-胡萝卜素” 谢谢你的帮助 $ cat cmpg|awk '/[^\w\s({)}\r\n\[\]],/' 仅匹配至少包含一个逗号的行 至于为什么求反字符类与2匹配(这让我感到困惑,因为\w包含所有ASCII数字,因此[^\w…]应该无法匹配2):awk使用POSIX基本正则表达式,而这些表达式不知道\w(或\s)速记。您将需要使用[:alnum://code>或[:space://code> 总而言之,这个正

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

谢谢你的帮助

$ cat cmpg|awk  '/[^\w\s({)}\r\n\[\]],/'
仅匹配至少包含一个逗号的行

至于为什么求反字符类与
2
匹配(这让我感到困惑,因为
\w
包含所有ASCII数字,因此
[^\w…]
应该无法匹配
2
):
awk
使用POSIX基本正则表达式,而这些表达式不知道
\w
(或
\s
)速记。您将需要使用
[:alnum://code>或
[:space://code>

总而言之,这个正则表达式在任何正则表达式风格中都是奇怪的。你想用它实现什么

$ cat cmpg|awk  '/[^\w\s({)}\r\n\[\]],/'
查找包含2个字符的任何字符串:

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

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

    • :a
      (逗号)

最后一行不包含逗号。(测试版将匹配,否则,因为它不是上面列表的一部分)

@TimPietzcker:我可以在OS X和Linux上重新创建他的结果。因为cmpg的最后一行不包含逗号,
?@TimPietzcker:您可能有一个unicode输入文件,所以您需要确保awk理解(并匹配)unicode。尝试设置LC_ALL=…(正确的unicode设置)时,您使用了错误的字母。您需要“β”(希腊小写字母BETA),但使用的是“ß”(拉丁小写字母夏普S)…以及逗号前面的否定字符类中没有的字符(挑剔)但是为什么第二行匹配呢?您的输入文件可能是unicode,awk看到的不是“2”?请尝试检查该awk是否可以处理unicode,如果可以,请确保使用正确的区域设置“cat cmpg | LC|u ALL=…awk'..”。我不是很具体,但是ymmv(取决于您使用的awk、您拥有的地区、文件使用的地区。utf-8?其他什么?)或者它是一个不知道
\w
的awk版本,因此将其视为一个文字
w
?尝试将第二行编辑为“w”而不是“2”,如果它不再匹配,那是因为“\w”被解释为“w”啊,我刚刚发现了同样的事情。只有
gawk
知道这些速记。您可以切换到Perl以避免大多数regexps的可移植性问题(但即使如此,一些Perl版本可能(不确定)有不同的选项或对复杂字符代码的不同处理…)
$ cat cmpg|awk  '/[^\w\s({)}\r\n\[\]],/'