代码之家  ›  专栏  ›  技术社区  ›  Roman

为什么awk不从生产线中间删除BOM?

  •  -2
  • Roman  · 技术社区  · 7 年前

    我尝试使用awk从文件中删除所有字节顺序标记(我有很多):

    awk '{sub(/\xEF\xBB\xBF/,"")}{print}' f1.txt > f2.txt
    

    它似乎删除了行开头的所有BOM表,但中间的BOM表没有删除。我可以通过以下方式进行验证:

    grep -U $'\xEF\xBB\xBF' f2.txt
    

    Grep返回一行,BOM在中间在中间。

    1 回复  |  直到 7 年前
        1
  •  1
  •   l'L'l    7 年前

    如前所述 sub() 将只交换最左边的子字符串,因此如果全局是您在使用 gsub() ,甚至更好 gensub() 就是要走的路。

    sub(regexp,replacement[,target])

    搜索目标,将其视为字符串,搜索最左边、最长的 由正则表达式regexp匹配的子字符串。修改整个 字符串成为目标的新值。返回

    gsub(regexp,replacement[,target])

    搜索所有最长、最左侧、不重叠的目标 它可以找到匹配的子字符串,并用替换替换它们。这个 g英寸 gsub() 代表“全球”,意思是“到处替换”。

    gensub(regexp,replacement,how[,target])#

    在目标字符串目标中搜索正则表达式的匹配项 全局),然后用替换替换regexp的所有匹配项。 否则,“how”被视为一个数字,指示regexp的哪个匹配项 替换。 gensub() 是一个一般的替代函数。其目的是提供比标准更多的功能 gsub() 功能。

    下面链接了更多有用的信息和示例:

    The GNU Awk User's Guide: String Functions / 9.1.3 String-Manipulation Functions