Unicode'u destekleyen sed'e alternatif var mı?


33

Örneğin:

sed 's/\u0091//g' file1

Şu anda, hexdumponaltılık sayıyı almak ve sedşöyle koymak zorundayım :

$ echo -ne '\u9991' | hexdump -C
00000000  e9 a6 91                                          |...|
00000003

Ve sonra:

$ sed 's/\xe9\xa6\x91//g' file1

Yanıtlar:


28

Sadece bu sözdizimini kullanın:

sed 's/馑//g' file1

Veya kaçan formda:

sed "s/$(echo -ne '\u9991')//g" file1

(Bash'in eski sürümlerinin ve bazı mermilerin anlamadığını unutmayın echo -e '\u9991', bu nedenle önce kontrol edin.)


1
Sed, character'yı bir karakter veya 3 olarak sayıyor mu? Yani, echo 馑 | sed s/...//herhangi bir şey yazdırıyor mu?
user253751 17:15

@ immibis sedg değiştiricisine sahip olduğundan, birbirlerini takip ettiklerinde de tüm olayların yerini alır. Ayrıca sed onu bir karakter olarak saymalı, bakınız: echo -ne "馑" | wc -mverir 1. Baytları ( wc -c) sayarsanız geri dönecektir 3. Sorunuzu doğru anladım mı?
kaos,

Demek istediğim: ."bir karakter" veya "bir bayt" anlamına mı geliyor?
kullanıcı253751

@ immibis Bir karakterle eşleşiyorum echo 馑 | sed s/...//, o yüzden bana veriyor (hiçbir şey değiştirilmez)
kaos

4
@ chaos: Altında çalışır, altında en_US.UTF-8değildir C.
choroba

15

Perl bunu yapabilir:

echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'

-CS standart girdi, çıktı ve hata için UTF-8'i açar.


7
Perl neredeyse her şeyi yapabilir .....
wobbily_col

6

sedUnicode desteğinin bir dizi sürümü :

Garip olduğunu düşündüğüm BSD sed hakkında bilgi bulamadım, ancak Unicode'u da destekleme ihtimalinin iyi olduğunu düşünüyorum. Ne yazık ki, sedhangi kodlamanın kullanılacağını söylemenin standart bir yolu yoktur , bu yüzden her biri bunu kendi yöntemleriyle yapar.


BOM olan ve olmayan UTF-16'yı destekliyorlar mı?
Bon Ami

10
UTF-16, Unix tabanlı işletim sistemlerinde kullanılamaz durumda. Aynı zamanda, gün ışığını hiç görmemiş olması gereken bir kötülük.
Brian Bi

UTF-16'yı destekleyip desteklememeleri uygulamaya bağlıdır ve korkarım o veriye sahip değilim. Plan 9 sed'in yaptığından şüpheliyim (orijinal işletim sistemi her yerde UTF-8'dir), ancak emin olamıyorum ve olmasa bile diğerleri olabilir.
The Spooniest

2

Bu benim için çalışıyor:

$ vim -nEs +'%s/\%u9991//g' +wq file1

İstediğimden daha fazla bir damla; İşte tam bir açıklama:

  • -n vim takas dosyasını devre dışı bırak
  • -E Geliştirilmiş moddan çık
  • -s sessiz mod
  • +'%s/\%u9991//g' ikame komutunu yürütün
  • +wq kaydet ve çık

Sanırım bu file1 yerinde değişiklik yaptı , doğru mu?
gerrit

@gerrit bu doğru ve gösterdiğiniz için teşekkürler.
Aryeh Leib Taurog

1

BASH'nin son sürümlerinde, sed ifadesinin etrafındaki alıntıları atlayın ve BASH'in çıkış karakterlerini kullanabilirsiniz. Sed ifadesindeki boşluklar veya sed ifadesinin BASH tarafından joker karakterler olarak yorumlanabileceği bölümleri ayrı ayrı alıntılanabilir.

$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻

Bu kabul edilen yeni cevap olmalı, basit ve temiz!
Allen Wang

0

Benim için çalışıyor GNU sed (sürüm 4.2.1):

$ echo -ne $'\u9991' | sed 's/\xe9\xa6\x91//g' | hexdump -C
$ echo -ne $'\u9991' | hexdump -C
00000000  e9 a6 91

( sedSizin için başka bir yedek olarak GNU'yu da kullanabilirsiniz awk; ancak gerekli görünmüyor.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.