2

私は次のことを試しました:

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

しかし、私の端末はウムラウトを認識しないため、すべての u を \"u に置き換えます。tex には、この問題を解決できるパッケージとその他の機能があることは知っていますが、当面は sed の方法に興味があります。

4

3 に答える 3

4

根本的な問題はsed、 、ロケール、端末、シェル、および操作対象のファイルの間に複雑な相互作用があることです。ここに試してみることのリストがあります。

  • 運が良ければ、シェル、sedおよび作業中のファイルは、置き換えようとしている文字を何として表現するかについて完全に一致しています。あなたの場合、あなたはすでにそれを試みましたが、失敗しました。

    sed 's/ü/\\"u/g' filename.tex
    
  • 少し運が悪いだけなら、他の部分は問題sedありません。それは、置換しようとしている文字シーケンスを理解するのに十分なほど現代的ではないということです. sedあなたのような単純なスクリプトは、perl代わりに単純に渡すことができます。これは通常、文字エンコーディングに関してはより最新です。

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

    文字エンコーディングが UTF-8 の場合、Perl にオプションを渡し-CSDたり、置換したい文字をある種のエスケープで表現したりする必要があるかもしれません。\xfc生の 16 進コード (たまたまüLatin-1 と Latin-9\x{00fc}にあります) または Unicode 文字、または\N{LATIN SMALL LETTER U WITH DIAERESIS}; とさえ言えます。ただし、Unicode にはこのグリフの表現がいくつかあることに注意してください (事前構成または分解、正規化または非正規化)。http://perldoc.perl.org/perlunicode.htmlも参照してください。

    (インプレース編集の場合は、おそらく-iオプションも追加する必要があります。)

  • 最後に、置き換えたい文字コードの生のバイトを分解して単純に把握する必要がある場合があります。問題のあるファイルの 16 進ダンプの数行が役立つはずです。その後、Perl は対処できるはずですが、文字セットのエンコードとデコードなどを無効にする方法を理解する必要があります。たとえば、問題のあるシーケンスが機能することがわかった0xFF 0x03場合perl -pe 's/\xff\x03/\\"u/g' filename.tex

于 2013-01-23T11:56:41.543 に答える
0

試す

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