Tüm metni büyük harfe küçük harfe veya tersine dönüştürür mü?


17

Benim sorum, tüm metni büyük harfe küçük harfe veya tam tersine nasıl dönüştürebilirim? Bu, tüm harflerin durumlarını değiştirmek içindir. Bir sedşekilde bir değiştirme ile yapılmalıdır .


4
trdaha uygun olurdu sed.
choroba

Yanıtlar:


20

İşte düz bir yol sed:

$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy

veya sedyerel ayarınızda küçük harf <-> büyük harf dönüşümü olan herhangi bir karakterle çalışırken GNU ile daha kısa bir yol :

$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy

aşağıdaki gibi başka bir araç kullanabiliyorsanız:

perl (ASCII harfleriyle sınırlıdır):

$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy

perl (daha genel olarak):

$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ

3
İkincisiniz sedgirişte bir GNU ve alternatif bir durum olduğunu varsayar . sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'Bunun yerine kullanın (yine de GNU'ya özgü). İlki yalnızca 26 ASCII latin harfini, ikincisi ise yerel ayarınız olarak tanınan herhangi bir harfi dönüştürür. trBiri yalnızca ASCII yerellerde mantıklı. perlBiri yalnızca ASCII Latin harfi çalışır.
Stéphane Chazelas

16

POSIXly, @cuonglm'nin gösterdiğised gibi, harf çevirmek istediğiniz harflerin tamamını sağlama dışında bu işlem yapılamaz .

Bununla birlikte yapılabilir trve bunun triçin (transliterasyon):

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

Ancak, Linux'ta sınırlamaları var. trLinux tabanlı sistemlerde yaygın olarak bulunan 3 uygulamadan:

  • GNU ile tr, bu sadece tek baytlık karakter kümeleri için çalışır. Örneğin, Stéphane ChazelasUTF-8 yerel ayarlarında, bunun sTéPHANE cHAZELASyerine verir sTÉPHANE cHAZELAS. Bu, GNU'nun bilinen bir sınırlamasıdır tr.
  • ile trişi değil yadigarı ToolChest gelen (Alacağınız stéphane chazelas).
  • Meşgul kutusunun tryapacağı şey bu değil .

FreeBSD üzerinde olsa Tamam çalışır. Sertifikalı Unix sistemlerinde de sorunsuz çalışmasını beklersiniz.


bashKabuk bunun için özel bir operatör var:

in=AbCdE
out=${in~~}

İle zsh -o extendedglob:

out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}

Yani masaüstü dünyasında sadece OSX yapıyor mu? Neden çalışmıyor? Aksanlı karakterin küçük harfli versiyonu ile büyük harfli karşılığı arasında onaltılı değerde sabit bir ofset olduğu anlaşılan sadece farklı uygulamalar mıdır?

1
@ illuminÉ, masaüstü dünyasıyla ne demek istediğinizden emin değilim . AFAICS, sorun GNU ile, çoğu Unices "masaüstü" var. ASCII ve bazı iso8859 karakter kümeleri dışında, onaltılık ofset özelliğini genelleştirebileceğinizi ve UTF-8 gibi kodlamalarla mantıklı olmayacağını bilmiyorum. Örneğin UTF-8'de büyük harf (e2 b4 a0) (e1 83 80); Her iki i(69) ve ı(C4 b1) sahip I(49) halinde (Türk yerlerinden dışında büyük ihale gelir İ). GNU ile çalışmamasının nedeni tr, GNU'nun trkarakterlerle değil baytlarla çalışmasıdır.
Stéphane Chazelas

Ben bir çeşit anaakım demek istedim ama bu pek mantıklı değil. Sadece Fransız aksanlı karakterlere (ve gerçekten sadece "é") baktım ve yine baytlarla ilgili olduğunu unutarak çok basit varsayımlar yaptım. Ama yadigâh mı? Bu cevabı tekrar okuyacağım!

1
@ illuminÉ, yadigâr için farklı bir konudur, sadece [:lower:]ya da sadece bir oluşumunu desteklediği anlaşılmaktadır [:upper:](bu yüzden birincisi göz ardı edilir). Hatta Fransızca, œ -> Œolan c5 93 -> c5 92UTF-8 ve bd -> bciso8859-15 içinde.
Stéphane Chazelas

2

Bu, trStéphane Chazelas tarafından sunulan çözümle aynı sınırlamalara sahip olsa da , bunu yapmanın başka bir yolu:

{   echo QWERTYqwerty | dd conv=lcase
    echo QWERTYqwerty | dd conv=ucase 
} 2>/dev/null

ÇIKTI

qwertyqwerty
QWERTYQWERTY

Ben dökümü stderriçine /dev/nullçünkü orada ddda tüm faaliyetlerinin istatistikler sağlar 2dosya tanımlayıcı. Bu, ne yaptığınıza bağlı olarak yararlı olabilir, ancak bu gösterim için değildi. ddÖrneğin, yapabileceğiniz diğer tüm şeyler hala geçerlidir, örneğin:

echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null

ÇIKTI:

QWERTY
QWERTY

Olguyu değiştirmez (olduğu gibi aBcdönüştürülmez AbC).
Stéphane Chazelas

1
@ StéphaneChazelas - doğru, ama yanlış anlamadıysam, soru bu değildi, değil mi?
mikeserv

2

Ana hedefiniz bir dosyayı alt sınıftan üst sınıfa dönüştürmekse, neden kullanmıyorsunuz trve STDOUTdosyanızı dönüştürmüyorsunuz:

$cat FILENAME | tr a-z A-Z > FILENAME2

FILENAMEOrijinal dosyanız nerede . FILENAME2Dönüştürülen çıktı dosyanız nerede .


Vurgulu karakterlerle çalışmadı, éörneğin (en azından dosyamda).
Sigur


0

ruby bunun için bir dize yöntemi vardır, komut satırından benzer bir kullanım perl

$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy

Ayrıca bakınız ruby-doc Kodlama

$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ'  | ruby -pe '$_.swapcase!'
ΑβΓ

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.