我试图在目录中的许多文本文件中查找和替换单个字符。对于可能出现的重复表示歉意,但我未能在其他sed线程中找到答案。
我使用Homebrew安装gnu-sed,并使用以下命令:
find . -name "*.txt" -exec gsed -i -e 's/ñ/–/g' '{}' \;我有一个“test”文件,其中包含我需要在目录中替换的字符,这些字符都被找到并正确替换。但其他文本文件中的其他字符则不然。例如:‘'Weíre to丹麦all’(也没有找到/替换)。
为什么会这样?我怎么才能修好它?谢谢!
编辑-输出
$ od -c filethatworks.txt | head -2
0000000 – ** ** \n – ** ** \n “ ** ** \n “ ** ** \n
0000020 — ** ** \n — ** ** \n - \n “ ** ** \n “ **
$ od -c filethatdoesnot.txt | head -2
0000000 T h o s e b l e s s e d d a
0000020 y s o f s u m m e r a r e对于工作正常的文件,file命令返回
test.txt: UTF-8 Unicode text对于一个没有:
ca001_mci_17071971.txt: Non-ISO extended-ASCII text, with very long lines, with CRL
F line terminators发布于 2017-11-07 01:08:05
人物是人的概念。当字符在计算机文件中表示时,需要对它们进行编码。编码将每个字符与一个称为代码点的整数关联起来。
例如,以字符"ă“为例(小写为"a”,顶部有一个缩略语,用于元音/ə/的罗马尼亚语拼写);在以前的MS中,我们经常使用名为"代码页852“的编码,其中"ă”的代码点为199。然后,Windows出现了,在Windows上,我们经常使用名为"代码页1250“的编码,其中"ă”的代码点227。然后是Unicode,在Unicode中,"ă“有代码点259。
由于Unicode代码点的值可以大于255,所以必须有一种方法来使用值介于0到255之间的字节来表示它们。这些方法被称为"Unicode转换格式“(UTF),其中应用最广泛的是UTF-8 (在Linux中非常流行)和乌特夫-16 (分为小的和大的两种,在Windows上非常流行)。在UTF-8中,“”表示为两个字节,值为196和131 (根据UTF-8的规则,这两个字节一起表示代码点259);在小endian UTF-16中,"ă“由两个字节表示,值为3和1(由小endian UTF-16的规则表示,这两个字节一起表示代码点259)。
要点是,为了理解文本文件,您需要知道(1)使用了什么编码,(2)在Unicode的情况下,使用了什么转换格式。现在,在Linux和网络上,我们非常接近于一个共识,即所有的文本都用UTF-8表示;然而,旧的文件仍然存在,偶尔会有新的文件来自Windows,因此有一个非常好的程序iconv (在Linux和在Windows上上都可用)用来将文本文件从一种编码转换为另一种编码。
例如,假设您的问题文件是在Windows-1252中编码的( Windows文档也称为ANSI,尽管美国国家标准协会与其无关),您可以这样说
iconv -f windows-1250 -t utf-8 ca001_mci_17071971.txt | gsed -e 's/ñ/–/g' '{}'遗憾的是,没有办法使用sed -i;您必须编写一个临时输出文件,然后在源文件的顶部重命名临时输出文件,当然,在检查一切顺利之后。
https://stackoverflow.com/questions/47146153
复制相似问题