web-dev-qa-db-ja.com

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でこの変換を実行するにはどうすればよいですか?

11
plamtrue

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

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

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

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

GNU tr は、おそらく次の理由で機能しません。

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

はマルチバイト文字です:

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

二重引用符やその他の文字も変換したい場合は、 GNU iconv を使用できます。

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

//TRANSLIT接尾辞は、iconvに、ターゲットエンコーディング(ここではASCII)のレパートリー外の文字に対して、似たような文字またはシーケンスを自動的に置換できることを伝えます。接尾辞がなければ、iconvは翻訳できない文字を見つけるとすぐにgiveめます。

//TRANSLITはGNU拡張であると思われることに注意してください: POSIX iconv はサポートしていません。

9
deltab

次の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
3
αғsнιη

tr-sオプションを使用します。

$ 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