Yanıtlar:
İş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'
ΑβΓ
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.
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:
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.trişi değil yadigarı ToolChest gelen (Alacağınız stéphane chazelas).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]}}
ⴠ(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.
[: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.
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
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
QWERTY
QWERTY
aBcdönüştürülmez AbC).
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 .
éörneğin (en azından dosyamda).
kullanarak awk:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txtdosyayı
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!'
ΑβΓ
Basit bir şeyi basit tutun. Karakterleri çevirmek için tasarlanmış filtre tr.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
trdaha uygun olurdused.