就像在以下问题中讨论的那样:
grep 可能会停止处理它认为是二进制的文件。
虽然这通常不是一个大问题,但在搜索文本文件时,事实证明,有时某些文本文件是“脏”的,即包含一些二进制数据。
我提出这个问题的具体情况是,不知何故,一些二进制数据(无论 grep 认为是二进制的,请参阅引用的问题)进入了文件.bash_history
,我想将其删除。
如何从文本文件中删除二进制数据?
不仅仅是删除二进制数据,我很高兴能够查看什么是有问题的(对 grep )二进制数据,以避免删除需要/重要的东西。
答案1
cat -v .bash_history > newbashhistory
查看 newbashhistory 并决定是否喜欢它
答案2
查看包含非文本数据的行的一种方法是:
perl -nle 'print if m/[^ -~\t\r]/' .bash_history | hexdump -C
基本上打印该行,如果它匹配一个字符不是( ^
) 在空格到波形符范围内(可打印的内容,根据 的评论ascii(7)
),也不是其他一些非文本但还可以的字符(换行符应该由标志神奇地处理-l
)。
如果这些行的二进制内容看起来可以销毁,那么您可以通过以下方式删除它们:
perl -i.whoopsie -ple 's/[^ -~\t\r]//g' .bash_history
然后也许使用
cmp -l .bash_history.whoopsie .bash_history
验证正确的二进制文件已被销毁。