Odpowiedzi:
Oto prosty sposób na sed:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
lub w skrócie z GNU sed, pracując z dowolnym znakiem, dla którego w twoim języku istnieje konwersja małych liter <->:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
jeśli możesz użyć innych narzędzi, takich jak:
perl (ograniczone do liter ASCII):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
perl (bardziej ogólnie):
$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ
sedi zmienną wielkość liter na wejściu. Użyj sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'zamiast tego (wciąż specyficzne dla GNU). Pierwszy konwertuje tylko 26 liter łacińskich ASCII, a drugi konwertuje każdą literę rozpoznaną jako taką przez twoje ustawienia regionalne. Ten trma sens tylko w ustawieniach regionalnych ASCII. Ten perldziała tylko dla łacińskich liter ASCII.
POSIXly, nie da się tego zrobić sedinaczej niż poprzez dostarczenie pełnego zestawu liter, które chcesz transliterować, jak pokazał @cuonglm .
Można to jednak zrobić za pomocą tri właśnie po to tr(transliteracja):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Jednak w systemie Linux ma ograniczenia. Z 3 trimplementacji powszechnie spotykanych w systemach Linux:
tr, który działa tylko dla jednobajtowych zestawów znaków. Na przykład, Stéphane Chazelasw ustawieniach regionalnych UTF-8, to daje sTéPHANE cHAZELASzamiast sTÉPHANE cHAZELAS. To znane ograniczenie GNU tr.trzestawem narzędzi rodowych, to nie działa (dostajesz stéphane chazelas).trzrobi busyboks .Na FreeBSD działa jednak OK. Można się spodziewać, że będzie działał dobrze również w certyfikowanych systemach uniksowych.
bashPowłoka ma przypisanego operatora na to:
in=AbCdE
out=${in~~}
Z zsh -o extendedglob:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
ⴠ(e2 b4 a0) to Ⴠ(e1 83 80); zarówno i(69), jak i ı(c4 b1) mają I(49) jako wielkie litery (z wyjątkiem tureckich lokalizacji, w których się ipojawia İ). Powodem, dla którego nie działa z GNU, trjest to, że GNU trdziała z bajtami, a nie ze znakami.
[:lower:]lub [:upper:](więc pierwszy jest ignorowany). Nawet w języku francuskim œ -> Œjest c5 93 -> c5 92w UTF-8 i bd -> bcw iso8859-15.
Chociaż ma to już te same ograniczenia, co trrozwiązanie oferowane przez Stéphane Chazelas, jest to inny sposób:
{ echo QWERTYqwerty | dd conv=lcase
echo QWERTYqwerty | dd conv=ucase
} 2>/dev/null
qwertyqwerty
QWERTYQWERTY
I zrzucić stderrsię /dev/nulltam, ponieważ ddzapewnia również statystyki wszystkich swoich działań na 2deskryptorze pliku. Może to być przydatne w zależności od tego, co robisz, ale nie było w tej demonstracji. ddNadal obowiązują wszystkie inne rzeczy, które możesz zrobić , na przykład:
echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null
QWERTY
QWERTY
aBcnie jest konwertowany na AbC).
Jeśli Twoim głównym celem jest konwersja pliku z klasy niższej do wyższej, dlaczego nie używasz tri STDOUTdo konwersji pliku:
$cat FILENAME | tr a-z A-Z > FILENAME2
Gdzie FILENAMEjest twój oryginalny plik. Gdzie FILENAME2jest przekonwertowany plik wyjściowy.
éna przykład (przynajmniej w moim pliku).
za pomocą awk:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txtzacznie od obcięcia pliku
ruby ma do tego metodę łańcuchową, podobne użycie z linii poleceń jak perl
$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy
Zobacz także kodowanie ruby-doc
$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ' | ruby -pe '$_.swapcase!'
ΑβΓ
Proste rzeczy proste. Filtr przeznaczony do tłumaczenia znaków to tr.
echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]
trbyłoby bardziej odpowiednie niżsed.