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でこの変換を実行するにはどうすればよいですか?
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.
GNU tr
は、おそらく次の理由で機能しません。
現在、
tr
は1バイト文字のみを完全にサポートしています。最終的にはマルチバイト文字をサポートします。その場合、-C
オプションは文字セットを補完し、-c
は値セットを補完します。この区別は、一部の値が文字ではない場合にのみ重要です。これは、入力にエンコードエラーが含まれるマルチバイトエンコードを使用するロケールでのみ可能です。
’
はマルチバイト文字です:
$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c
3
二重引用符やその他の文字も変換したい場合は、 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
はサポートしていません。
次の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
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