私は次のことを試しました:
sed -e 's/ü/\\"u/g' filename.tex>filename2.tex
しかし、私の端末はウムラウトを認識しないため、すべての u を \"u に置き換えます。tex には、この問題を解決できるパッケージとその他の機能があることは知っていますが、当面は sed の方法に興味があります。
私は次のことを試しました:
sed -e 's/ü/\\"u/g' filename.tex>filename2.tex
しかし、私の端末はウムラウトを認識しないため、すべての u を \"u に置き換えます。tex には、この問題を解決できるパッケージとその他の機能があることは知っていますが、当面は sed の方法に興味があります。
根本的な問題は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
。
試す
sed -i 's/\([\ä\ö\ü\Ä\Ü\Ö]\)/\&\1uml\;/g;y/\ä\ö\ü\Ä\Ö\Ü/aouAOU/;s/\ß/\ß\;/g' ${FILE}