2

我尝试了以下方法:

sed -e 's/ü/\\"u/g' filename.tex>filename2.tex

但我的终端无法识别元音变音符号,因此将所有 u 替换为 \"u。我知道 tex 有可能解决这个问题的包和其他东西,但我目前对 sed 方式感兴趣。

4

3 回答 3

4

sed根本问题是,您的语言环境、终端、shell 和您正在操作的文件之间存在复杂的交互。这是要尝试的事情的列表。

  • 如果你幸运的话,你的 shellsed和你正在处理的文件对于你试图替换的字符应该表示为什么完全一致。就您而言,您已经尝试过,但失败了。

    sed 's/ü/\\"u/g' filename.tex
    
  • 如果你只是稍微不那么幸运,其他部分都很好,只是你sed的现代性不足以理解你试图替换的字符序列。sed可以简单地将像您这样的简单脚本传递给perl它,这通常在字符编码方面是最新的。

    perl -pe 's/ü/\\"u/g' filename.tex
    

    如果字符编码是 UTF-8,您可能需要向-CSDPerl 传递一个选项,和/或用某种转义符表示您希望替换的字符。您可以说\xfc原始十六进制代码(恰好是üLatin-1 和 Latin-9)或\x{00fc}Unicode 字符,甚至\N{LATIN SMALL LETTER U WITH DIAERESIS}; 但请注意,Unicode 对此字形有多种表示形式(预先组合或分解,规范化与否)。另见http://perldoc.perl.org/perlunicode.html

    (对于就地编辑,也许您也想添加该-i选项。)

  • 最后,您可能需要分解并简单地找出要替换的字符代码的原始字节。有问题文件的几行十六进制转储应该会有所帮助。在那之后,Perl 应该能够应付,但是您需要弄清楚如何禁用字符集编码和解码等。例如,如果您发现有问题的序列应该0xFF 0x03可以perl -pe 's/\xff\x03/\\"u/g' filename.tex工作。

于 2013-01-23T11:56:41.543 回答
1

如果有人需要反过来:

sed -i 's/\\"u/ü/g;s/\\"a/ä/g;s/\\"o/ö/g;s/\\"U/Ü/g;s/\\"A/Ä/g;s/\\"O/Ö/g;s/{\\ss}/ß/g' *.tex
于 2014-02-21T12:43:43.867 回答
0

尝试

sed -i 's/\([\ä\ö\ü\Ä\Ü\Ö]\)/\&\1uml\;/g;y/\ä\ö\ü\Ä\Ö\Ü/aouAOU/;s/\ß/\&szlig\;/g' ${FILE} 
于 2013-01-23T11:18:51.467 回答