Regex awk reg表达式模式匹配不';行不通

Regex awk reg表达式模式匹配不';行不通,regex,shell,awk,Regex,Shell,Awk,我尝试使用[:digit:://code>匹配行中的数字,下面是代码 ~ 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 statemen

我尝试使用
[:digit:://code>匹配行中的数字,下面是代码

~ 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
~echo-e“abc\n123\ndef”| awk'{/[:digit:]/{print$0}
awk:源代码第1行出现语法错误
上下文是

>>>{/[:digit:][]/{你不能把你的图案放在大括号里

awk '/[[:digit:]]/{print $0}'
语法应该是

 awk 'condition{execute if the condition is true}'
在某些情况下,条件本身就足够了。对于这种情况,下面的条件就足够了

awk '/[[:digit:]]/'
示例:

$ echo -e "abc\n123\ndef" | awk '/[[:digit:]]/'
123
为什么要使用
[:digit:][]
而不是
[:digit:][/code>

POSIX括号内的表达式
[:digit:][/code>单独与数字字符不匹配,您必须将其放入字符类中,如
[:digit:][]

如果您希望匹配数字和
+
符号,则可以修改上述POSIX类,如

[+[:digit:]]

你不能把你的图案放在大括号里

awk '/[[:digit:]]/{print $0}'
语法应该是

 awk 'condition{execute if the condition is true}'
在某些情况下,条件本身就足够了。对于这种情况,下面的条件就足够了

awk '/[[:digit:]]/'
示例:

$ echo -e "abc\n123\ndef" | awk '/[[:digit:]]/'
123
为什么要使用
[:digit:][]
而不是
[:digit:][/code>

POSIX括号内的表达式
[:digit:][/code>单独与数字字符不匹配,您必须将其放入字符类中,如
[:digit:][]

如果您希望匹配数字和
+
符号,则可以修改上述POSIX类,如

[+[:digit:]]
Awk语法是:

<condition> { <action> }
因此,不是:

{/[[:digit:]]/{print $0}}
要在语法和习惯用法上正确,您应该写:

/[[:digit:]]/{print $0}
但由于打印$0是默认操作,因此您真正要写的是:

/[[:digit:]]/
i、 e:

至于为什么
[[:digit:][]
而不是
[:digit:][/code>:


[:digit:][/code>是一个POSIX字符类,因此可以在括号表达式中作为regexp的一部分使用,例如
[:digit:][/code>,就像范围表达式(
0-9
)或字符列表(
0123456789
)也可以在括号表达式中使用,效果相同

此示例可能有助于澄清:
[:digit://code>是字符类,
[:punt://code>也是字符类,
[:digit:[:putt:][\t]
是包含两个字符类和字符列表的括号表达式(
\t

来自POSIX():

字符类表达式表示为字符类名称 用括号括起-(“[:”和“:]”)分隔符

括号表达式(用方括号括起来的表达式,“[]” )…是匹配列表表达式或非匹配列表 表达式。它由一个或多个表达式组成:…,字符 班级

因此字符类是
[:]
,括号表达式是
[]
,其中
可以是/包含字符类:
[[:]

注意:有一个经常被引用的网站,其字符类和括号表达式的术语完全错误。或者更公平地说,他们使用的术语充其量是模糊的,因为他们将POSIX括号表达式称为“字符类”但是,他们也将POSIX字符类称为“字符类”。不管您如何描述它,因为他们在自己的网站上声明,他们的术语肯定不是POSIX用于括号表达式和字符类的术语,Awk语法是:

<condition> { <action> }
因此,不是:

{/[[:digit:]]/{print $0}}
要在语法和习惯用法上正确,您应该写:

/[[:digit:]]/{print $0}
但由于打印$0是默认操作,因此您真正要写的是:

/[[:digit:]]/
i、 e:

至于为什么
[[:digit:][]
而不是
[:digit:][/code>:


[:digit:][/code>是一个POSIX字符类,因此可以在括号表达式中作为regexp的一部分使用,例如
[:digit:][/code>,就像范围表达式(
0-9
)或字符列表(
0123456789
)也可以在括号表达式中使用,效果相同

此示例可能有助于澄清:
[:digit://code>是字符类,
[:punt://code>也是字符类,
[:digit:[:putt:][\t]
是包含两个字符类和字符列表的括号表达式(
\t

来自POSIX():

字符类表达式表示为字符类名称 用括号括起-(“[:”和“:]”)分隔符

括号表达式(用方括号括起来的表达式,“[]” )…是匹配列表表达式或非匹配列表 表达式。它由一个或多个表达式组成:…,字符 班级

因此字符类是
[:]
,括号表达式是
[]
,其中
可以是/包含字符类:
[[:]


注意:有一个经常被引用的网站,其字符类和括号表达式的术语完全错误。或者更公平地说,他们使用的术语充其量是模糊的,因为他们将POSIX括号表达式称为“字符类”但是,他们也将POSIX字符类称为“字符类”。不管你如何描述它,因为他们在自己的网站上声明自己,他们的术语肯定不是POSIX用于括号表达式的术语,字符类是“POSIX括号表达式”,应该在字符类中使用。我不会称之为“无效”。@EdMorton我认为你错了。
[:digit://code>,
[:punct://code>POSIX符号。我们需要将它们放在字符类中,以使其正常工作。
[:digit:[:punct:]
@EdMorton:我只是引用,我不是这个术语的所有者。似乎我还没有说服你正确的术语,所以我只是发布了我自己的答案,OP可以找到答案。
[:d