tr: アポストロフィをASCIIに変換する

tr: アポストロフィをASCIIに変換する

私は変換しようとしています右一重引用符アポストロフィを使用しますtr

tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b

a次の例を含む、UTF-8 でエンコードされたファイルがあるとします。

We’re not a different species
“All alone?” Jeth mentioned.

OS X は BSD を使用しておりtr、優れた結果を生み出します。

We're not a different species
“All alone?” Jeth mentioned.

Ubuntu は GNU を使用しておりtr、次のような厄介な結果が生成されます。

We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.

Ubuntu でこの変換を実行するにはどうすればよいでしょうか?

答え1

次のような他のツールを試すこともできますsed:

$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.

または、単純な翻訳を行っているため、次yのコマンドを使用しますsed

$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.

GNUtrおそらく以下の理由で動作しません:

現在、trシングルバイト文字のみを完全にサポートしています。最終的にはマルチバイト文字をサポートする予定です。サポートされると、-C オプションは文字セットを補完し、 は-c 値セットを補完します。この区別は、一部の値が文字でない場合にのみ重要になります。また、これは、入力にエンコード エラーが含まれている場合に、マルチバイト エンコードを使用するロケールでのみ可能です。

そして、マルチバイト文字です:

$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c  
3

答え2

二重引用符やその他の文字も変換したい場合は、次のようにします。GNUiconv:

$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.

サフィックスは、ターゲット エンコーディング (ここでは ASCII) の範囲外の文字については、似た文字またはシーケンスに自動的に置き換えることができることを//TRANSLIT示します。サフィックスがない場合、翻訳できない文字が見つかるとすぐに処理を中止します。iconviconv

これは//TRANSLITGNU 拡張のようです:POSIXiconvサポートしていません。

答え3

次のいずれかの解決策を使用できますawk

awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code

awk '{gsub(/’/, "\x27");print}' file

awk '{gsub(/\342\200\231/, "\47");print}'  file # with Octal ASCII code

awk '{gsub(/’/, "\47");print}' file

または

awk '{gsub(/’/, "'"'"'");print}' file

答え4

-s次のオプションを使用しますtr :

$ echo "We’re not a different species"|tr -s "’" "'"
We're not a different species

からman tr :

--truncate-set1
          first truncate SET1 to length of SET2

関連情報