[英]awk reg expression pattern matching doesn't work
我试图使用[:digit:]
来匹配行中的数字,这是代码。
~ echo -e "abc\n123\ndef" | awk '{/[[:digit:]]/{print $0}}'
awk: syntax error at source line 1
context is
>>> {/[[:digit:]]/{ <<<
awk: illegal statement at source line 1
awk: illegal statement at source line 1
我的问题是:
1,为什么用[[:digit:]]
代替[:digit:]
。
2,为什么此代码段无法运行? 怎么修改呢?
您不得将花样放在花括号内。
awk '/[[:digit:]]/{print $0}'
语法是
awk 'condition{execute if the condition is true}'
在某些情况下,仅满足条件就足够了。 对于这种情况,下面就足够了,
awk '/[[:digit:]]/'
例:
$ echo -e "abc\n123\ndef" | awk '/[[:digit:]]/'
123
为什么使用
[[:digit:]]
而不是[:digit:]
?
POSIX括起来的表达式[:digit:]
仅与数字字符不匹配,您必须将其放在[[:digit:]]
类的字符类中。
如果要匹配数字以及+
符号,则可以修改上述POSIX类,例如
[+[:digit:]]
AWK语法为:
<condition> { <action> }
如果当前记录的<condition>
为true,则执行<action>
。 您写的是:
{ <condition> { <action> } }
看到不同? 您可以在一个动作块中放置一个条件,但随后需要用适当的控制关键字将其括起来,例如if
或while
这样awk就会知道您想对该条件做什么:
{ if (<condition>) { <action> } }
{ while (<condition>) { <action> } }
因此,代替:
{/[[:digit:]]/{print $0}}
要在语法上和习惯上正确,您应该写:
/[[:digit:]]/{print $0}
但是由于打印$ 0是默认操作,所以您真正要写的是:
/[[:digit:]]/
即:
$ echo -e "abc\n123\ndef" | awk '/[[:digit:]]/'
123
至于为什么[[:digit:]]
而不是[:digit:]
:
[:digit:]
是POSIX字符类,因此可以在方括号表达式内用作正则表达式的一部分,例如[[:digit:]]
,就像范围表达式( 0-9
)或字符列表( 0123456789
)也可以在方括号表达式内使用,以达到相同的效果。
该示例可能有助于阐明: [:digit:]
是字符类, [:punct:]
也是如此,因此[[:digit:][:punct:] \\t]
是包含2个字符类和一个字符的方括号表达式列表( \\t
)。
从POSIX( http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm ):
字符类表达式表示为括在方括号(“ [:”和“:]”)分隔符内的字符类名称。
和
方括号表达式(用方括号括起来的表达式“ []”)...是匹配列表表达式或不匹配列表表达式。 它由一个或多个表达式组成:...,字符类,.....
因此,字符类为[:<name>:]
,括号表达式为[<expression>]
,其中<expression>
可以是/包含字符类: [[:<name>:]]
。
PS警告:有一个通常引用的网站http://www.regular-expressions.info/posixbrackets.html ,其中的字符类和括号表达式术语完全错误。 也许更公平地说,他们使用的术语充其量是含糊的,因为它们将POSIX括号表达式称为“字符类”,但随后又将POSIX字符类称为“字符类”。 但是,您要对其进行特征化,因为他们在自己的网站上声明自己,所以它们的术语肯定不同于POSIX用于括号表达式和字符类的术语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.