Jawaban:
Inilah cara langsung sed
:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
atau cara yang lebih pendek dengan GNU sed
, bekerja dengan karakter apa pun yang ada <-> konversi huruf kecil di lokal Anda:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
jika Anda dapat menggunakan alat lain, seperti:
perl
(terbatas pada surat ASCII):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl
(lebih umum):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sed
dan kasing alternatif di input. Gunakan sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'
sebagai gantinya (masih spesifik GNU). Yang pertama hanya mengonversi 26 huruf latin ASCII, sedangkan yang kedua mengonversi setiap huruf yang dikenali oleh lokal Anda. Yang tr
hanya masuk akal di lokal ASCII. Yang perl
satu hanya berfungsi untuk huruf latin ASCII.
POSIXly, itu tidak bisa dilakukan sed
kecuali dengan menyediakan set lengkap surat yang ingin Anda transliterasikan seperti yang ditunjukkan oleh @cuonglm .
Itu bisa dilakukan dengan tr
, dan itu tr
untuk (transliterate):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Namun, di Linux, ada batasannya. Dari 3tr
implementasi yang biasa ditemukan pada sistem berbasis Linux:
tr
, yang hanya berfungsi untuk set karakter byte tunggal. Misalnya, di Stéphane Chazelas
dalam lokal UTF-8, yang memberi sTéPHANE cHAZELAS
bukansTÉPHANE cHAZELAS
. Itu adalah keterbatasan GNU tr
.tr
dari toolchest heirloom, itu tidak berhasil (Anda dapatkan stéphane chazelas
).tr
.Pada FreeBSD itu berfungsi dengan baik. Anda akan mengharapkannya berfungsi dengan baik di sistem Unix bersertifikat juga.
The bash
shell memiliki operator khusus untuk itu:
in=AbCdE
out=${in~~}
Dengan zsh -o extendedglob
:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ
(e2 b4 a0) adalah Ⴠ
(e1 83 80); baik i
(69) dan ı
(c4 b1) memiliki I
(49) sebagai huruf besar (kecuali di lokal Turki di mana i
menjadi İ
). Alasan tidak bekerja dengan GNU tr
adalah karena GNU tr
bekerja dengan byte dan bukan karakter.
[:lower:]
atau [:upper:]
(jadi yang pertama diabaikan). Bahkan di Perancis, œ -> Œ
adalah c5 93 -> c5 92
dalam UTF-8 dan bd -> bc
di iso8859-15.
Meskipun ini memiliki keterbatasan yang sama yang telah disebutkan sebagai tr
solusi yang ditawarkan oleh Stéphane Chazelas, ini adalah cara lain untuk melakukannya:
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
Saya membuang stderr
ke /dev/null
sana karena dd
juga menyediakan statistik dari semua operasinya pada 2
deskriptor file. Ini bisa bermanfaat tergantung pada apa yang Anda lakukan, tetapi tidak untuk demonstrasi ini. Semua hal lain yang dapat Anda lakukan dd
masih berlaku, misalnya:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBc
tidak dikonversi ke AbC
).
Jika tujuan utama Anda adalah untuk mengkonversi file dari kelas bawah ke kelas atas, mengapa tidak Anda gunakan tr
dan STDOUT
untuk mengkonversi file Anda:
$cat FILENAME | tr a-z A-Z > FILENAME2
Di mana FILENAME
file asli Anda. Di mana FILENAME2
file hasil konversi Anda.
é
misalnya (setidaknya dalam file saya).
menggunakan awk
:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txt
akan memulai dengan memotong file
ruby
memiliki metode string untuk itu, penggunaan yang serupa dari baris perintah seperti perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
Lihat juga Encoding ruby-doc
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
Buat hal yang sederhana tetap sederhana. Filter yang dirancang untuk menerjemahkan karakter adalah tr
.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
tr
akan lebih cocok daripadased
.