有哪些方法可以比较文件类型和编码来解决有问题的 grep...?

有哪些方法可以比较文件类型和编码来解决有问题的 grep...?

在本例中,我有一个使用创建的 .txt 文件的文件夹拖拽、复制、粘贴来自 OSX 中的 Adob​​e Acrobat PDF 和文本编辑器。我一直在 vim 中编辑这些文件。现在我使用 grep 在这些文件中查找注释。例如,

grep -c "\[t\]" Herbert*

[t]是注释,该目录有 22 个带有名称前缀的文件Herbert*(如Herbert-02-Transformation.txt, Herbert-14-Classification.txt)。问题是grep只能在一个文件 ( ) 中找到搜索字符串Herbert-03-Square.txt,但每个文件多次出现相同的注释。

converted当我打开故障文件时,它们会显示在状态栏中,

"Herbert-02-Transformation.txt" [converted] 276L, 57171C

unix.stack 上的帖子表明原始文件中的特殊字符在从 PDF 到 vim 的过程中幸存下来,导致了这个问题grep。我一直在删除粗略的字符并手动插入正确的:digraphs.某些已编辑的文件可以通过 grep 搜索,而其他已编辑的文件则不能。我尝试使用,

:e Herbert-02-Transformation.txt
:set encoding=utf-8` 
:w

但文件仍然打开,如上所示。现在我想我需要弄清楚如何比较那些正在grep工作的文件和那些不工作的文件的编码。有足够的帮助页面详细说明如何设置文件检测为了避免这个问题,我花了超过 1.5 个小时研究这个问题,现在我认为这是一个很好的问题......

答案1

最简单的方法是将问题文件之一中的几行传递给od

head Herbert-02-Transformation.txt | od -c

或者,如果您在第一行中没有看到任何奇怪的内容,请查找您的特定字符串及其周围的一些字符:

od -c Herbert-02-Transformation.txt | grep -C 5 "\["

例如:

$ echo "lorem ipsum [t] dolor sit amet" > foo.txt
$ od -c foo.txt 
0000000   l   o   r   e   m       i   p   s   u   m       [   t   ]    
0000020   d   o   l   o   r       s   i   t       a   m   e   t  \n
0000037

任何“奇怪”的字符都会被显示od


另一个有用的工具file将返回文件类型和其他信息:

$ file --mime foo.txt 
foo.txt: text/plain; charset=us-ascii

答案2

如果您有一个已知编码的文本文件,其中包含不属于该编码的无效字符,您可以使用iconv -c -f charset -t charset file.小心不要在此过程中覆盖原始文件,因为如果选择错误的字符集,结果可能是灾难性的。

例如摆脱元音变音:

$ echo Nähkästchen | iconv -c -f us-ascii -t us-ascii
Nhkstchen

如果其中的字符有意义,则搜索和替换可能更合适。取决于里面到底有什么。

相关内容