代码之家  ›  专栏  ›  技术社区  ›  Michael Back

如何干净地处理/忽略(Unicode?)awk中无法打印的二进制字符

  •  1
  • Michael Back  · 技术社区  · 7 年前

    我有一个文件,我试图与表达式/^[\t]*r/匹配,我在一个文件中发现一行(第一行)令人沮丧地拒绝与awk或egup匹配。有问题的行(在编辑器中)看起来确实是以__R_开头;但是,当我用od-ax转储文件时,我发现该文件实际上是以以下开头:

    0000000  o   ;   ?   r
              bbef    72bf
    

    我该怎么处理?理想情况下,我想在我的模式中向括号表达式添加一些内容,这样模式基本上说从R开始,忽略空格、制表符和奇怪的非ASCII垃圾。

    2 回复  |  直到 7 年前
        1
  •  0
  •   James Brown    7 年前

    正如评论中所说,这就是BOM。我在awk中使用这个来移除它:

    NR==1 {sub(/^\xef\xbb\xbf/,"")}
    
        2
  •  1
  •   Ed Morton    7 年前

    gsub(/[^\x00-\x7F]/,"") 过滤掉任何非ASCII字符?例如:

    $ awk 'BEGIN{printf "foo \xef\xbb\xbf bar\n"}' | cat -v
    foo M-oM-;M-? bar
    
    $ awk 'BEGIN{printf "foo \xef\xbb\xbf bar\n"}' | od -ax
    0000000   f   o   o  sp   o   ;   ?  sp   b   a   r  nl
               6f66    206f    bbef    20bf    6162    0a72
    0000014
    
    $ awk 'BEGIN{printf "foo \xef\xbb\xbf bar\n"}' | awk '{gsub(/[^\x00-\x7F]/,"")}1' | cat -v
    foo  bar
    
    $ awk 'BEGIN{printf "foo \xef\xbb\xbf bar\n"}' | awk '{gsub(/[^\x00-\x7F]/,"")}1' | od -ax
    0000000   f   o   o  sp  sp   b   a   r  nl
               6f66    206f    6220    7261    000a
    0000011
    

    [\x00-\x7F] [[:ascii:]] 其他一些工具显然支持。