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'
ΑβΓ
sed
i 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 tr
ma sens tylko w ustawieniach regionalnych ASCII. Ten perl
działa tylko dla łacińskich liter ASCII.
POSIXly, nie da się tego zrobić sed
inaczej niż poprzez dostarczenie pełnego zestawu liter, które chcesz transliterować, jak pokazał @cuonglm .
Można to jednak zrobić za pomocą tr
i właśnie po to tr
(transliteracja):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Jednak w systemie Linux ma ograniczenia. Z 3 tr
implementacji powszechnie spotykanych w systemach Linux:
tr
, który działa tylko dla jednobajtowych zestawów znaków. Na przykład, Stéphane Chazelas
w ustawieniach regionalnych UTF-8, to daje sTéPHANE cHAZELAS
zamiast sTÉPHANE cHAZELAS
. To znane ograniczenie GNU tr
.tr
zestawem narzędzi rodowych, to nie działa (dostajesz stéphane chazelas
).tr
zrobi busyboks .Na FreeBSD działa jednak OK. Można się spodziewać, że będzie działał dobrze również w certyfikowanych systemach uniksowych.
bash
Powł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ę i
pojawia İ
). Powodem, dla którego nie działa z GNU, tr
jest to, że GNU tr
działa z bajtami, a nie ze znakami.
[:lower:]
lub [:upper:]
(więc pierwszy jest ignorowany). Nawet w języku francuskim œ -> Œ
jest c5 93 -> c5 92
w UTF-8 i bd -> bc
w iso8859-15.
Chociaż ma to już te same ograniczenia, co tr
rozwią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ć stderr
się /dev/null
tam, ponieważ dd
zapewnia również statystyki wszystkich swoich działań na 2
deskryptorze pliku. Może to być przydatne w zależności od tego, co robisz, ale nie było w tej demonstracji. dd
Nadal 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
aBc
nie jest konwertowany na AbC
).
Jeśli Twoim głównym celem jest konwersja pliku z klasy niższej do wyższej, dlaczego nie używasz tr
i STDOUT
do konwersji pliku:
$cat FILENAME | tr a-z A-Z > FILENAME2
Gdzie FILENAME
jest twój oryginalny plik. Gdzie FILENAME2
jest przekonwertowany plik wyjściowy.
é
na przykład (przynajmniej w moim pliku).
za pomocą awk
:
awk '{print tolower($0)}' file.txt | tee file.txt
>file.txt
zacznie 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:]
tr
byłoby bardziej odpowiednie niżsed
.