我有一个包含不需要的空字符(ASCII nul、\0)的文本文件。当我试图在vi中查看它时,我看到了交错在普通文本中的^@符号。我如何:
\0
vi
^@
1.确定文件中哪些行包含空字符?我尝试过对\0和\x0执行GREGING,但这不起作用。1.是否删除空字符?在文件上运行strings会将其清除,但我只是想知道这是不是最好的方法?
\x0
strings
at0kjp5o1#
我会使用tr:
tr
tr < file-with-nulls -d '000' > file-without-nulls
<
>
eiee3dmh2#
使用以下sed命令删除文件中的空字符。
sed -i 's/x0//g' null.txt
此解决方案可就地编辑文件,如果文件仍在使用,这一点很重要。传递-I‘ext’将创建添加了‘ext’后缀的原始文件的备份。
shyt4zoc3#
大量不需要的NUL字符(例如每隔一个字节一个)表示文件是以UTF-16编码的,您应该使用iconv将其转换为UTF-8。
iconv
fbcarpbf4#
我发现了以下内容,可以打印出哪些行(如果有的话)包含空字符:
perl -ne '/000/ and print;' file-with-nulls
此外,八进制转储可以告诉您是否有空值:
od file-with-nulls | grep ' 000'
pjngdqdw5#
如果文件中的行以\r\n\000结尾,那么有效的方法是删除\n\000,然后用\n替换。
tr -d 'n000' <infile | tr 'r' 'n' >outfile
kxeu7u2r6#
以下是如何使用ex(就地)删除空字符的示例:
ex
ex -s +"%s/%x00//g" -cwq nulls.txt
对于多个文件:
ex -s +'bufdo!%s/%x00//g' -cxa *.txt
对于递归性,您可以使用globbing option**/*.txt(如果您的外壳支持它)。
**/*.txt
由于sed及其-i参数是非标准的BSD扩展,因此对脚本很有用。
sed
-i
另请参阅:How to check if the file is a binary file and read all the files which are not?
ohfgkhjo7#
我使用:
recode UTF-16..UTF-8 <filename>
去掉文件中的零。
l2osamch8#
我也犯了同样的错误:
import codecs as cd f=cd.open(filePath,'r','ISO-8859-1')
我通过将编码更改为utf-16解决了这个问题
utf-16
f=cd.open(filePath,'r','utf-16')
8条答案
按热度按时间at0kjp5o1#
我会使用
tr
:<
、>
、…)实际上,在命令行中的任何位置。*eiee3dmh2#
使用以下sed命令删除文件中的空字符。
此解决方案可就地编辑文件,如果文件仍在使用,这一点很重要。传递-I‘ext’将创建添加了‘ext’后缀的原始文件的备份。
shyt4zoc3#
大量不需要的NUL字符(例如每隔一个字节一个)表示文件是以UTF-16编码的,您应该使用
iconv
将其转换为UTF-8。fbcarpbf4#
我发现了以下内容,可以打印出哪些行(如果有的话)包含空字符:
此外,八进制转储可以告诉您是否有空值:
pjngdqdw5#
如果文件中的行以\r\n\000结尾,那么有效的方法是删除\n\000,然后用\n替换。
kxeu7u2r6#
以下是如何使用
ex
(就地)删除空字符的示例:对于多个文件:
对于递归性,您可以使用globbing option
**/*.txt
(如果您的外壳支持它)。由于
sed
及其-i
参数是非标准的BSD扩展,因此对脚本很有用。另请参阅:How to check if the file is a binary file and read all the files which are not?
ohfgkhjo7#
我使用:
去掉文件中的零。
l2osamch8#
我也犯了同样的错误:
我通过将编码更改为
utf-16
解决了这个问题