为什么awk似乎没有根据替代“。”拆分成字段?

时间:2015-02-25 16:43:35

标签: awk

可以在.上分享:

>printf foo.bar | awk '{split($0, a, "."); print a[1]}'
foo

可以选择其他选项:

>printf foo.bar | awk '{split($0, a, "b|a"); print a[1]}'
foo.

那么为什么拆分涉及.

的替代方案是不行的
>printf foo.bar | awk '{split($0, a, ".|a"); print a[1]}'

(没有打印)

2 个答案:

答案 0 :(得分:2)

逃离那个时期,我认为你会成为金色的:

 printf foo.bar | awk '{split($0, a, "\\.|a"); print a[1]}'

答案 1 :(得分:0)

JNevill展示了如何让它发挥作用。但是为了回答你为什么在一个案例而不是另一个案例中需要逃避的问题,我们可以在awk手册中找到答案,根据FS的值,如何分割字段"如何分割字段。&# 34; (并且相同的规则适用于split命令的 fieldsep 。)

底线是当FS是单个字符时,它不被视为正则表达式,否则它被视为正则表达式。

因此split($0, a, ".")正如我们希望的那样工作,.确实是.,但split($0, a, ".|a")需要.|a成为.的正则表达式}具有特殊含义,将分隔符设置为任何字符,并且必须添加反斜杠以对.进行字面处理。

  

FS ==" "
  字段由空格分隔。前导和尾随空格被忽略。这是默认值。

     

FS ==任何单个字符
      字段由每次出现的字符分隔。多个连续出现分隔空字段,如前导和   尾随事件。

     

FS == regexp
      字段由出现与regexp匹配的字符分隔。正则表达式的前导和尾随匹配分隔空字段。

你可以看到尽管空结果.|a确实正在做某事,将该行划分为8个空字段 - 与,,,,,,,之类的行相同FS设置到,

$ printf foo.bar | awk '{split($0, a, ".|a"); for (i in a) print i ": " a[i]; }'
4: 
5: 
6: 
7: 
8: 
1: 
2: 
3: