我想用转义序列分割行,但失败了。例如:
$ 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是否支持带正则表达式的lookahead或lookbehind字段分隔符?
最佳答案
正如我在评论中所说,awk不支持先行或后向,因为它使用POSIX扩展正则表达式(ERE)。如果您确实需要先行或后行,则可能要使用Perl。但是,在这种情况下,您可以稍微更改解决问题的方法。
如果您的数据包含定界符,而不是通过查找未转义的定界符来拆分数据(当一行中有许多\
时,定界符可能会失败),那么最好直接匹配这些字段。
匹配字段的正则表达式为/([^\\,]|\\.)+/
。请注意,此正则表达式不知道带引号的字段。如果要支持它们,则取决于您如何处理引号未正确关闭或字段中有多个引号的情况。如果您可以假设数据格式正确,则只需提出一个适用于数据的正则表达式即可。
这是一些可以帮助您入门的东西。下面的代码在一行中打印所有字段。
echo "1,2\,2,333" | awk '{while (match($0, /([^\\,]|\\.)+/)) {print substr($0, RSTART, RLENGTH);$0=substr($0, RSTART+RLENGTH)}}'
引用
关于regex - 带有正则表达式的awk字段分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30430502/