【问题标题】:Identifying and removing null characters in UNIX在 UNIX 中识别和删除空字符
【发布时间】:2011-01-24 19:10:12
【问题描述】:

我有一个包含不需要的空字符(ASCII NUL,\0)的文本文件。当我尝试在vi 中查看它时,我看到^@ 符号,在普通文本中交错。我该怎么做:

  1. 确定文件中的哪些行包含空字符?我试过 grepping \0\x0,但这没有用。

  2. 删除空字符?在文件上运行strings 会清理它,但我只是想知道这是否是最好的方法?

【问题讨论】:

标签: unix shell null special-characters


【解决方案1】:

我遇到了同样的错误:

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

我通过将编码更改为utf-16解决了这个问题

f=cd.open(filePath,'r','utf-16')

【讨论】:

    【解决方案2】:

    以下是如何使用ex(就地)删除 NULL 字符的示例:

    ex -s +"%s/\%x00//g" -cwq nulls.txt
    

    对于多个文件:

    ex -s +'bufdo!%s/\%x00//g' -cxa *.txt
    

    对于递归,你可以使用globbing option**/*.txt(如果你的shell支持的话)。

    因为sed 及其-i 参数是非标准的BSD 扩展,所以对脚本很有用。

    另见:How to check if the file is a binary file and read all the files which are not?

    【讨论】:

      【解决方案3】:

      我用过:

      recode UTF-16..UTF-8 <filename>
      

      去除文件中的零。

      【讨论】:

        【解决方案4】:

        如果文件中的行以 \r\n\000 结尾,那么可行的方法是删除 \n\000,然后将 \r 替换为 \n。

        tr -d '\n\000' <infile | tr '\r' '\n' >outfile
        

        【讨论】:

        • 附言。如果您发现自己处于 Windows DOS shell,您可以从 Sourceforge.net 获得 GNU/win32 版本的 Unix 命令。我一直在使用它们。查看“od”八进制转储命令以分析文件中的内容...
        【解决方案5】:

        我会使用tr:

        tr < file-with-nulls -d '\000' > file-without-nulls
        

        如果您想知道命令参数中间的输入重定向是否有效,它确实有效。实际上,大多数 shell 都会在命令行中的任何位置识别并处理 I/O 重定向(&lt;&gt;、...)。

        【讨论】:

        • 实际上,我认为应该是tr -d '\000' &lt; file-with-nulls &gt; file-without-nulls,因为&lt; 是shell 管道功能的一部分,而不是tr
        • 实际上,大多数 shell 会识别并处理参数字符串中的 。也让我感到惊讶。
        • +1 用于输入重定向而不是cat |。一个很好,干净的解决方案,它解决了我的问题。
        • 这对我来说比sed 慢了一个数量级
        • @Pointy '\000' 用于代替 tr 的 POSIX opengroup 规范中的 '\0'。这是一个很好的理由喜欢它
        【解决方案6】:

        使用以下 sed 命令删除文件中的空字符。

        sed -i 's/\x0//g' null.txt
        

        此解决方案在原地编辑文件,如果该文件仍在使用中,这一点很重要。传递 -i'ext' 会创建一个添加了 'ext' 后缀的原始文件的备份。

        【讨论】:

        • 注意:在 FreeBSD(我相信 Mac OS X)中,sed -i 需要在下一个参数中添加一个扩展名,但它可能为空。在这些系统中,添加'',如:sed -i '' 's/\x0//g "$FILE"
        • 对我来说这比tr快一个数量级
        • 对我来说,使用 Git for Windows 和 $ sed --version -> sed (GNU sed) 4.7,我必须使用以下调用来获取名为 example.csv.bak 的备份文件:sed -i.bak 's/\x0//g' example.csv
        • @TimČ你做得很好,只是错过了一个 ' 所以它应该是 sed -i '' 's/\x0//g' some_file.xml
        • 在 mac 上,这只是第一个空字符,而不是所有字符。 gsed 确实完成了所有这些工作。
        【解决方案7】:

        我发现了以下内容,它会打印出哪些行(如果有)有空字符:

        perl -ne '/\000/ and print;' file-with-nulls
        

        此外,八进制转储可以告诉您是否有空值:

        od file-with-nulls | grep ' 000'
        

        【讨论】:

          【解决方案8】:

          大量不需要的 NUL 字符,比如每隔一个字节,表示文件是用 UTF-16 编码的,您应该使用 iconv 将其转换为 UTF-8。

          【讨论】:

          • 我的应用程序正在记录时磁盘空间不足。这导致了这些字符。
          • 例如,它使用这个命令:iconv -f UTF-16 -t UTF-8 file.
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-14
          • 2013-04-14
          • 2020-12-04
          • 2018-12-25
          • 1970-01-01
          • 2011-05-28
          相关资源
          最近更新 更多