![tr: アポストロフィをASCIIに変換する](https://rvso.com/image/977082/tr%3A%20%E3%82%A2%E3%83%9D%E3%82%B9%E3%83%88%E3%83%AD%E3%83%95%E3%82%A3%E3%82%92ASCII%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B.png)
私は変換しようとしています右一重引用符にアポストロフィを使用します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
示します。サフィックスがない場合、翻訳できない文字が見つかるとすぐに処理を中止します。iconv
iconv
これは//TRANSLIT
GNU 拡張のようです: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