我想用转义序列拆分但是失败了.例如:
$ 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 `,'
Run Code Online (Sandbox Code Playgroud)
awk/gawk是否支持带regexp 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)}}'
Run Code Online (Sandbox Code Playgroud)