首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sed没有找到/替换目录中的所有字符

Sed没有找到/替换目录中的所有字符
EN

Stack Overflow用户
提问于 2017-11-06 21:30:12
回答 1查看 164关注 0票数 0

我试图在目录中的许多文本文件中查找和替换单个字符。对于可能出现的重复表示歉意,但我未能在其他sed线程中找到答案。

我使用Homebrew安装gnu-sed,并使用以下命令:

代码语言:javascript
复制
find . -name "*.txt" -exec gsed -i -e 's/ñ/–/g' '{}' \;

我有一个“test”文件,其中包含我需要在目录中替换的字符,这些字符都被找到并正确替换。但其他文本文件中的其他字符则不然。例如:‘'Weíre to丹麦all’(也没有找到/替换)。

为什么会这样?我怎么才能修好它?谢谢!

编辑-输出

代码语言:javascript
复制
$ 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命令返回

代码语言:javascript
复制
test.txt: UTF-8 Unicode text

对于一个没有:

代码语言:javascript
复制
ca001_mci_17071971.txt: Non-ISO extended-ASCII text, with very long lines, with CRL
F line terminators
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,尽管美国国家标准协会与其无关),您可以这样说

代码语言:javascript
复制
iconv -f windows-1250 -t utf-8 ca001_mci_17071971.txt | gsed -e 's/ñ/–/g' '{}'

遗憾的是,没有办法使用sed -i;您必须编写一个临时输出文件,然后在源文件的顶部重命名临时输出文件,当然,在检查一切顺利之后。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47146153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档