使用 sed 搜索和替换,解释反向引用的内容以更正损坏的 ISO-8859-1 字符代码

Search and replace with sed, interpreting back reference's content in order to correct corrupted ISO-8859-1 char codes

我有文本文件(大的,数百万行),最初是用 ISO-8859-1 编码的,但不知何故被破坏了,导致 "special" 个字符(那些,从 0xA0 映射到 0xFF,除了 ASCII 之外),被替换为它们的八进制代码。

示例:“ü”字符(十六进制:0xFC)已替换为其八进制代码,在 4 个字符上:“\374”。

我一直在尝试编写一些 sed 命令来处理这些八进制代码并将它们替换回相应的原始 ISO-8859-1 字符,但我在 4 的解释部分遗漏了一些东西字符代码。

到目前为止,我的 sed 命令搜索 \abc 形式的任何一组 4 个字符,其中 abc 是一个介于 000 和 377 之间的数字,然后尝试用 \oabc 替换它 - 这应该会产生 ISO -8859-1编码字符:

paul@paul:~$ sed 's,\\([0-3][0-7][0-7]\),\o,g' file

然而,该替换部分将不起作用,因为 sed 不会将 \o 解释为 ISO-8859-1 代码(就像我在执行 sed 's/u/\o374/' 文件时所做的那样)。

如果我的文件包含:

(...) D4sseldorf (...)

我的 sed 命令会将其替换为:

(...) D\o374sseldorf (...)

这里有没有人可以指出我哪里错了?

Gnu sed在解释命令的时候会解释\oxxx,所以它必须在sed命令中按字面意思出现。 (其他 sed 可能根本不会解释 \oxxx;我并不是要暗示他们会按照您建议的方式进行解释。)如所写,\o 是无效的转义码(它后面没有八进制数),因此不会被替换,而 </code> 被匹配中的第一个捕获替换。</p> <p>您可以使用像 Perl 这样的语言更轻松地完成此转换,它允许您执行代码以生成替换:</p> <pre><code>perl -pe 's/\([0-3][0-7][0-7])/chr(oct())/eg'