Jawaban:
Cukup gunakan sintaks itu:
sed 's/馑//g' file1
Atau dalam bentuk lolos:
sed "s/$(echo -ne '\u9991')//g" file1
(Perhatikan bahwa versi Bash yang lebih lama dan beberapa shell tidak mengerti echo -e '\u9991'
, jadi periksa dulu.)
sed
memiliki pengubah g, ia menggantikan semua kejadian juga ketika mereka saling mengikuti. Juga sed harus menghitungnya sebagai satu karakter, lihat: echo -ne "馑" | wc -m
memberi 1
. Jika Anda menghitung byte ( wc -c
) itu akan kembali 3
. Apakah saya memahami pertanyaan Anda dengan benar?
.
berarti "satu karakter" atau "satu byte"?
echo 馑 | sed s/...//
memberi saya 馑
(tidak ada yang diganti)
en_US.UTF-8
, tetapi tidak di bawah C
.
Perl dapat melakukan itu:
echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'
-CS
menyalakan UTF-8 untuk input, output dan kesalahan standar.
Sejumlah versi sed
dukungan Unicode :
Saya tidak dapat menemukan informasi tentang BSD sed, yang saya pikir aneh, tetapi saya pikir kemungkinannya bagus karena mendukung Unicode juga. Sayangnya, tidak ada cara standar untuk mengetahui sed
pengkodean mana yang akan digunakan, sehingga masing-masing melakukan ini dengan caranya sendiri.
Ini bekerja untuk saya:
$ vim -nEs +'%s/\%u9991//g' +wq file1
Setetes lebih banyak kata daripada yang saya inginkan; inilah penjelasan lengkapnya:
-n
nonaktifkan file swap vim-E
Ex mode ditingkatkan-s
mode diam+'%s/\%u9991//g'
jalankan perintah substitusi+wq
Simpan dan keluarfile1
di tempat , apakah itu benar?
Dengan versi BASH terbaru, cukup hapus tanda kutip di sekitar ekspresi sed dan Anda dapat menggunakan string BASH yang lolos. Spasi dalam ekspresi sed atau bagian dari ekspresi sed yang mungkin ditafsirkan oleh BASH sebagai wildcard dapat dikutip secara individual.
$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻
echo 馑 | sed s/...//
mencetak sesuatu?