regex - 带有正则表达式的awk字段分隔符

标签 regex awk

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

$ 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)}}'

引用
  • How to get match regex pattern using awk from file?
  • 关于regex - 带有正则表达式的awk字段分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30430502/

    相关文章:

    linux - 提取两个相同分隔符(多实例分隔符)之间的行

    c# - 正则表达式与包含 4 个组的字符串不匹配

    javascript - 使用 JavaScript 正则表达式的建议

    php - mysql正则表达式匹配带点和不带点的字符串

    javascript - 忽略正则表达式中的回车

    bash - 查找多个文件的公共(public)行

    linux - 如何使用 linux 命令在一行中的偶数位置用点替换空格

    javascript - 正则表达式:将字符串与具有相同模式的子字符串匹配

    python - 如何将一列数据(文本)包装成8列,并可以在Excel中以8列样式删除?

    awk:警告:转义序列 `\]'被视为纯 `]'