我尝试了以下内容:
sed -e 's/ü/\\"u/g' filename.tex>filename2.tex
但我的终端无法识别变音符号,所以用“你”取代所有你。我知道tex有包和什么可以解决这个问题,但我现在对sed方式感兴趣。
答案 0 :(得分:4)
根本问题在于sed
,您的区域设置,终端,shell以及您正在操作的文件之间存在复杂的交互。以下是要尝试的事项列表。
如果您很幸运,您的shell sed
以及您正在处理的文件已完全同意您要替换的字符应表示为。在你的情况下,你已经尝试过,但它失败了。
sed 's/ü/\\"u/g' filename.tex
如果你只是稍微不那么幸运,其他部分都很好,只是你的sed
不够现代,无法理解你想要替换的角色序列。像你这样的简单sed
脚本可以简单地传递给perl
,这通常是更新的字符编码。
perl -pe 's/ü/\\"u/g' filename.tex
如果字符编码是UTF-8,您可能需要将-CSD
选项传递给Perl,和/或用某种类型的转义表示您要替换的字符。您可以说\xfc
表示原始十六进制代码(拉丁语-1和拉丁语9中恰好是ü
)或Unicode字符\x{00fc}
,甚至是\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
应该工作
答案 1 :(得分: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
答案 2 :(得分:0)
尝试
sed -i 's/\([\ä\ö\ü\Ä\Ü\Ö]\)/\&\1uml\;/g;y/\ä\ö\ü\Ä\Ö\Ü/aouAOU/;s/\ß/\ß\;/g' ${FILE}