2012-07-17 77 views
0

我试图通过一堆数据可能包含加拿大邮政编码(格式A0A 0A0)并希望打印行。中间可能有或没有空间。我试过以下正则表达式:匹配0或1个空格的字符串

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}} 

但是,这给出了相同的结果。有人可以发现我做错了什么吗?

+0

会'\ s?'工作? – TheZ 2012-07-17 21:05:49

+0

它似乎并不如此。我不确定awk将\ s视为空白。它似乎更喜欢[:space:],但是[:space:] +也不起作用。 – Ilion 2012-07-17 21:08:26

+0

哦,对不起,我错过了? \ s?只返回没有空间的线。 – Ilion 2012-07-17 21:10:29

回答

2

Plus指定重复一次或多次的事情,这可能不是您想要的。你需要一个问号,使前面的项目可选。

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

谢谢。我的Perl大脑让我对这些操作员的工作方式有不同的想法。 – Ilion 2012-07-17 21:13:00

+1

@Ilion:运营商是一样的。除了'?'的'{0,1}'含义外,Perl在'。*?'中增加了非贪婪的含义,例如,AWK不支持。顺便说一句,'+'相当于'{1,}','*'是'{0,}',用于比较 – 2012-07-17 21:25:35

+0

啊对。谢谢。 – Ilion 2012-07-17 21:59:49

0

似乎A0A 0A0awk在两个字段(默认为空格)分开,所以你应该改变FS(字段分隔符)变量或与第一部分和$6与第二个比较$5

+0

嗯,是的,我确实有不同的分隔符,但是从我的例子中删除了,因为我认为这只是一句粗话。当然这会改变这一切。对困惑感到抱歉! – Ilion 2012-07-17 21:11:50

1

使用?

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