Awk字段分隔符与regexp向前或向后看



我想用转义序列分割行,但失败了。例如:

$ echo "1,2,2,333"|awk -F "(?<!\,)," '{print $2}'   ## expecting "2,2"
awk: warning: escape sequence `!' treated as plain `!'
awk: warning: escape sequence `,' treated as plain `,'

awk/gawk支持regexp前向还是后向字段分隔符

正如我在评论中所说,awk不支持向前查找或向后查找,因为它使用POSIX扩展正则表达式(ERE)。如果您确实需要向前查找或向后查找,您可能需要使用Perl。然而,在这种情况下,你可以稍微改变一下你的方法来解决问题。

如果您的数据包含分隔符,而不是通过寻找未转义的分隔符来分割数据(当一行中有许多时可能会失败),最好直接匹配字段。

匹配字段的正则表达式是/([^\,]|\.)+/。请注意,这个正则表达式不知道引号字段。如果您想支持它们,则取决于您如何处理引号未正确关闭或字段中有多个引号的情况。如果您可以假设您的数据格式良好,那么您可以提出一个适用于您的数据的正则表达式。

这里有一些东西可以让你开始。下面的代码打印一行中的所有字段。

echo "1,2,2,333" | awk '{while (match($0, /([^\,]|\.)+/)) {print substr($0, RSTART, RLENGTH);$0=substr($0, RSTART+RLENGTH)}}'
参考

  • 如何从文件中使用awk获得匹配正则表达式模式?

处理这个问题的一种方法是在gnu-awk中使用FPAT(按内容划分):

awk 'BEGIN{ FPAT=",([^\\]*\\,)*[^,]*,|[^,]+" } {
  for (i=1; i<=NF; i++) {gsub(/^,|,$/, "", $i); printf "$%d: <%s>n", i, $i}
}' <<< "1,2,2,333"
$1: <1>
$2: <2,2>
$3: <333>

最新更新