繁体   English   中英

awk reg表达式模式匹配不起作用

[英]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> } }

看到不同? 您可以在一个动作块中放置一个条件,但随后需要用适当的控制关键字将其括起来,例如ifwhile这样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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM