Regex linux正则表达式匹配chracter和xDF;
我遇到了在Linux中看不到的东西。有谁能告诉我为什么第一个正则表达式没有提取“ß-胡萝卜素” 谢谢你的帮助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> 总而言之,这个正
$ 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
的特殊含义,则使用Literalw
\s
:空白(如果使用unicode,可能会有很多东西,而不仅仅是空格和制表符)
- 或者如果awk版本不知道
\s
的特殊含义,则使用Literals
(
: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\[\]],/'