2014-09-23 39 views
1

你好我想下面的字符串匹配无济于事在AWK使用正则表达式似乎找不到模式

echo '[xxAA][xxBxx][C]' | awk -F '/\[.*\]/' '{ for (i = 1; i <= NF; i++) printf "-->%s<--\n", $i }' 

我基本上希望有每个字段是一个封闭的支架,使得

场1 = xxAA 字段2 = xxBxx 字段3 = C

但一直收到以下结果

-->[xxAA][xxBxx][C]<-- 

任何指针我哪里错了?

回答

1

正则表达式/\[.*\]/匹配整个输入,因为.*匹配输入内部的][以及匹配字母。

你可能分裂的“]”字符区域,而不是,然后把它再次回到输出:

echo '[xxAA][xxBxx][C]' | awk -F ']' '{ for (i = 1; i <= NF; i++) if ($i != "") printf "-->%s]<--\n", $i }' 
2

可以在字段分隔符使用正则表达式。我们将字符类中的[]附在字符类中,以将其视为文字。两者之间由逻辑OR逻辑|分隔。由于我们将它们作为字段分隔符来对待,我们只是遍历偶数字段的数字来获取输出。

$ echo '[xxAA][xxBxx][C]' | awk -v FS="[]]|[[]" '{ for (i=2;i<=NF;i+=2) print $i }' 
xxAA 
xxBxx 
C 
+1

+1,我不知道awk接受一个模式作为字段分隔符,并且方括号不需要在字符类中转义。我将在这篇文章中添加awk:http://stackoverflow.com/questions/17845014/what-does-the-regex-mean – 2014-09-23 23:18:00

+1

我很惊讶你不能写这样的东西:'] | \ ['或'\] | \ ['。但似乎你可以写:'[] []' – 2014-09-23 23:29:35

+1

感谢@CasimiretHippolyte为投票和链接的帖子。这是非常丰富的。是的,理想情况下应该写'[] []'。我只是借此机会建议在字段分隔符中使用逻辑“或”运算符。 – 2014-09-23 23:32:28

1

这是GNU awk的FPAT变量的作业,它可以让你指定的字段的模式,而不是场分离的模式:

$ echo '[xxAA][xxBxx][C]' | awk -v FPAT='[^][]+' '{ for (i = 1; i <= NF; i++) printf "-->%s<--\n", $i }' 
-->xxAA<-- 
-->xxBxx<-- 
-->C<-- 

与其他awks我会使用:

$ echo '[xxAA][xxBxx][C]' | awk -F'\\]\\[' '{ gsub(/^\[|\]$/,""); for (i = 1; i <= NF; i++) printf "-->%s<--\n", $i }' 
-->xxAA<-- 
-->xxBxx<-- 
-->C<-- 
+1

我会诚实的。即使我有GNU'awk' 4.1,并且已经使用了一段时间'FPAT'和'patsplit'是两个未被充分利用的特性。 – 2014-09-23 23:38:37

+1

是的,我还没有找到使用patsplit()我自己,但FPAT是有用的,尤其是对于CSV解析。 – 2014-09-23 23:40:06

+0

确实如此,使用'FPAT'解析引用的CSV是有帮助的。我只是使用'Text :: ParseWords'核心模块和'perl',主要是在RHEL 6机器上工作的机器仍然使用GNU'awk' 3.x。 – 2014-09-23 23:44:02