Awk 将字符串与0或1个空格匹配

Awk 将字符串与0或1个空格匹配,awk,Awk,我试图浏览一组可能包含加拿大邮政编码的数据(formatA0A 0A0),并希望打印包含加拿大邮政编码的行。中间可能有或可能没有空间。我尝试了以下正则表达式: awk '{if($5~/[a-zA-Z][0-9][a-zA-Z] +[0-9][a-zA-Z][0-9]/){print $5}} 这将返回有空格的行。我认为“+”将使它返回带和不带的两行。我还尝试: awk '{if($5~/[a-zA-Z][0-9][a-zA-Z][ ]+[0-9][a-zA-Z][0-9]/){print $

我试图浏览一组可能包含加拿大邮政编码的数据(format
A0A 0A0
),并希望打印包含加拿大邮政编码的行。中间可能有或可能没有空间。我尝试了以下正则表达式:

awk '{if($5~/[a-zA-Z][0-9][a-zA-Z] +[0-9][a-zA-Z][0-9]/){print $5}}
这将返回有空格的行。我认为“+”将使它返回带和不带的两行。我还尝试:

awk '{if($5~/[a-zA-Z][0-9][a-zA-Z][ ]+[0-9][a-zA-Z][0-9]/){print $5}}

但结果是一样的。有人能发现我做错了什么吗?

Plus指定重复一次或多次的内容,这可能不是您想要的。您需要一个问号,它将使前面的项成为可选项

awk '{if($5~/[a-zA-Z][0-9][a-zA-Z] ?[0-9][a-zA-Z][0-9]/){print $5}}

Plus指定重复一次或多次的内容,这可能不是您想要的内容。您需要一个问号,它将使前面的项成为可选项

awk '{if($5~/[a-zA-Z][0-9][a-zA-Z] ?[0-9][a-zA-Z][0-9]/){print $5}}

似乎
a0a0
在两个字段中被
awk
分割(默认为空格),因此您应该更改
FS
(字段分隔符)变量或将
$5
与第一部分比较,将
$6
与第二部分比较。

a0a0
似乎在两个字段中被
awk
分割(默认为空格),因此您应该更改
FS
(字段分隔符)变量,或者将
$5
与第一部分比较,将
$6
与第二部分比较。

使用

awk '$5~/[a-zA-Z][0-9][a-zA-Z] ?[0-9][a-zA-Z][0-9]/ {print $5}'
使用

awk '$5~/[a-zA-Z][0-9][a-zA-Z] ?[0-9][a-zA-Z][0-9]/ {print $5}'

似乎没有。我不确定awk是否将\s视为空白。它似乎更喜欢像[:space:],但[:space:]这样的内容也不起作用。哦,对不起,我错过了?\s?只返回没有空格的行。只使用空格后跟?起作用。它似乎没有起作用。我不确定awk是否将\s视为空白。它似乎更喜欢像这样的内容[:空格:],但是[:空格:]+也不起作用。哦,对不起,我错过了?\s?只返回没有空格的行。只使用空格后跟?起作用了。啊,是的,我确实有一个不同的分隔符,但从我的示例中删掉它,因为我认为它只是粗糙的。当然,这会改变一切。对于混淆,对不起!啊,是的,我确实有一个不同的分隔符tor但从我的示例中删掉它,因为我认为它只是粗糙的。当然,这会改变一切。很抱歉造成混淆!谢谢。我的Perl大脑让我对这些运算符的工作方式有了不同的思考。@Ilion:运算符是一样的。除了
{0,1}
的含义,Perl在
*?
中添加了一个非贪婪含义,例如,AWK不支持它。顺便说一下,
+
相当于
{1,}
*
{0,}
,用于比较。我的Perl大脑让我对这些运算符的工作方式产生了不同的思考。@Ilion:运算符是相同的。除了
{0,1}
的含义,Perl在
*?
中添加了一个非贪婪含义,例如,AWK不支持该含义。顺便说一下,
+
相当于
{1,}
*
{0,}
,用于比较