在本例中,我有一个使用创建的 .txt 文件的文件夹拖拽、复制、粘贴来自 OSX 中的 Adobe 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
如果其中的字符有意义,则搜索和替换可能更合适。取决于里面到底有什么。