Saya mencoba untuk mengkonversi Hak Tunggal Quotation Mark ke Apostrophe menggunakan tr
.
tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b
diberi file berkode UTF-8 a
yang disebut yang berisi contoh ini:
We’re not a different species
“All alone?” Jeth mentioned.
OS X menggunakan BSD tr
dan menghasilkan hasil yang bagus:
We're not a different species
“All alone?” Jeth mentioned.
Ubuntu menggunakan GNU tr
dan menghasilkan hasil buruk ini:
We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.
Bagaimana saya bisa menyelesaikan konversi ini di Ubuntu?
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
Jawaban:
Anda dapat mencoba beberapa alat lain, seperti
sed
:Atau, karena kami sedang melakukan terjemahan sederhana, gunakan
y
perintah untuksed
:GNU
tr
mungkin tidak berfungsi karena:Dan
’
merupakan karakter multibyte:sumber
sed
jauh lebih baik untuk jenis pekerjaan ini.tr
adalah mengganti masing-masing dari tiga byte secara terpisah dengan'
, karenanya'''
serta urutan rusak di mana ia telah menggantikan dua dari tiga byte dalam karakter yang sama“
dan”
. Seharusnya memahami tiga byte sebagai bersama-sama yang berarti satu karakter, dan ganti itu.’
adalah karakter multibyte juga kita dapat menggunakantr -c '[:print:][:cntrl:]' '-'
perintah untuk mengganti setiap karakter non-cetak , selain karakter kontrol yang valid, dengan a-
. Dan Anda akan melihat’
terjemahan tunggal hingga 3 byte karakter seperti---
. poin bagus untuk karakter multi-byte.Jika Anda juga ingin mengonversi tanda kutip ganda, dan mungkin karakter lain, Anda bisa menggunakan GNU
iconv
:The
//TRANSLIT
akhiran mengatakaniconv
bahwa untuk karakter luar repertoar pengkodean sasaran (di sini ASCII), dapat menggantikan karakter yang mirip atau urutan otomatis. Tanpa akhiran,iconv
akan menyerah begitu menemukan karakter yang tidak dapat diterjemahkan.Catatan yang
//TRANSLIT
tampaknya merupakan ekstensi GNU: POSIXiconv
tidak mendukungnya.sumber
Anda dapat menggunakan salah satu
awk
solusi ini :Atau
sumber
Gunakan
-s
opsitr
:Dari
man tr
:sumber