UTF-8 txt dosyalarını bash içindeki tüm büyük harflere nasıl dönüştürebilirim?


10

Tüm büyük harfe dönüştürmek istiyorum bazı UTF-8 .txt dosyaları var. Sadece ASCII olsaydı, şunu kullanabilirdim:

tr [:lower:] [:upper:]

Ama aksanlarla ve şeylerle çalıştığım için işe yaramıyor gibi görünüyor. Ben uygun yerel ayarladıysanız işe yarayabilir, ancak taşınabilir olması için bu komut dosyası gerekir sanırım.

Yanıtlar:


14

Hepsi:

tr '[:lower:]' '[:upper:]'

(tırnak unutmayın aksi o olmaz eser adlı bir dosya varsa :, l... veya rgeçerli dizinde) veya:

awk '{print toupper($0)}'

veya:

dd conv=ucase

geçerli yerel ayarda tanımlanan kurallara göre karakterleri büyük harfe dönüştürmek içindir. Bununla birlikte, yerel ayarların karakter kümesi olarak UTF-8 kullandığı ve küçük harften büyük harfe dönüştürmeyi açıkça tanımladığı durumlarda bile, en azından GNU dd, GNU trve mawk( awkörneğin Ubuntu'da varsayılan ) bunları takip etmez. Ayrıca, veya dışında yerel ayarları belirtmenin standart bir yolu yoktur , bu nedenle UTF-8 dosyalarını geçerli yerel ayardan bağımsız olarak taşınabilir şekilde büyük harfe dönüştürmek istiyorsanız, standart araç testinde şansınız kalmaz.CPOSIX

Taşınabilirlik için, en iyi bahsiniz perl olabilir:

$ echo lľsšcčtťzž | PERLIO=:utf8 perl -pe '$_=uc'
LĽSŠCČTŤZŽ

Şimdi, herkesin belirli bir karakterin büyük harfli versiyonunu kabul etmediğine dikkat etmelisiniz.

Mesela Türk yerlilerinde büyük harf ideğil I, İ( <U0130>). İşte trGNU tr yerine yadigâr araç takımı ile :

$ echo ií | LC_ALL=C.UTF-8 tr '[:lower:]' '[:upper:]'
IÍ
$ echo ií | LC_ALL=tr_TR.UTF-8 tr '[:lower:]' '[:upper:]'
İÍ

Benim sistemde, perlto-üst dönüştürme tanımlanır /usr/share/perl/5.14/unicore/To/Upper.plve bunu GNU libc'nizdeki birkaç karakterler farklı davrandığı bulmak toupper()içinde C.UTF8, örneğin yerel ayarı perldaha doğru olma. Örneğin perl, ɀ değerini correctly değerine doğru dönüştürür , GNU libc (2.17) yapmaz.


Bunun değeri için, tüm büyük harflerin açıkça tanımlandığı Çek harfleriyle (ve kullandığınız örnek aslında Slovakça) çalışıyorum, ancak yerel ayar muhtemelen Çek değil C olacak ve bu bir sorun. Perl bu araç zincirinde zaten kullanılıyor, bu yüzden başka bir kullanım eklemek çok kötü olmayabilir. Ayrıntılı açıklama için teşekkürler, btw!
VPeric

3

Bence bunu awkve toupperişlevi ile yapabilirsiniz .

Örneğin

GNU ile çalışmaz tr:

$ echo lľsšcčtťzž | tr '[:lower:]' '[:upper:]'
LľSšCčTťZž

GNU ile çalışır awk:

$ echo lľsšcčtťzž | awk '{ print toupper($0) }'
LĽSŠCČTŤZŽ

@StephaneChazelas - teşekkürler başarısız örneği değiştirdim.
slm

Bu, geçerli yerel ayara ve / trveya awkuygulamaya bağlıdır. Örneğin, çoğu trUTF8 yerel ayarındayken karakteri doğru değiştirir, geçerli yerel ayara göre GNU tryapmaz. mawkyapmaz.
Stéphane Chazelas

1
Aslında, FreeBSD'de (9.1), tam tersi. trawk
İle

@StephaneChazelas - 8-) varyanslarda tecrübeli değilim. Birisi az önce indirildi, merak ediyorum neden?
slm

2

Bu OS X'lerle çalışır trancak GNU ile çalışmaz tr:

tr '[:lower:]' '[:upper:]'

Bu veya ile ( gawkancak OS X'te) çalışır, ancak :mawknawk/usr/bin/awk

awk '{print toupper($0)}'

Başka bir seçenek GNU kullanmaktır sed:

sed 's/./\u&/g'

Bash 4.0 ve sonraki sürümlerde, ^^genişletme parametresini de kullanabilirsiniz :

while IFS= read -r l;do printf %s\\n "${l^^}";done
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.