Jakiego polecenia Bash można użyć do konwersji łańcucha wielkich liter na małe i odwrotnie?
Dziękuję Ci.
Jakiego polecenia Bash można użyć do konwersji łańcucha wielkich liter na małe i odwrotnie?
Dziękuję Ci.
Odpowiedzi:
Jeśli ciąg jest już zapisany w zmiennej, możesz użyć bash
rozszerzenia parametrów, szczególnie ${parameter,,pattern}
(dostępne od wersji bash 4.0), gdzie parameter
jest nazwa twojej zmiennej i pattern
jest ona odrzucana:
$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!
Zauważ, że to nie zmienia wartości zmiennej, tylko wynik. Aby zmienić zmienną, musisz przypisać nową wartość:
$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!
Konwersja wielkich liter działa z ${parameter^^pattern}
:
$ echo ${string^^}
HELLO, WORLD!
Działa to również z łańcuchami Unicode (przynajmniej w obecnych wersjach bash, prawdopodobnie wymaga co najmniej bash 4.3):
$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ
Jeśli używasz zsh
, możesz użyć Flagi rozszerzania parametrów ( ${(FLAGS)NAME}
; dostępne od zsh 2.5), aby osiągnąć te same wyniki. bash
Składnia nie działa w zsh
1) . Flaga dla małych liter to L
; dla wielkich liter jest to U
:
$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"
Działa to również z łańcuchami Unicode (przynajmniej od zsh 5.0; nie próbowałem z wcześniejszymi wersjami):
$ string='ἈΛΦΆβητος'
$ echo ${(L)string}
ἀλφάβητος
$ echo ${(U)string}
ἈΛΦΆΒΗΤΟΣ
1) Chociaż, widząc, że zsh miał to o wiele dłużej, prawdopodobnie powinno być: „ zsh
Składnia nie działabash
.
${string,,}
Zapis istnieje tylko w wersji bash 4+. W przeciwnym razie wymagane jest jedno z pozostałych rozwiązań, takie jak $(echo $string | tr '[:upper:]' '[:lower:]')
.
Istnieje bardzo niewiele metod, które działają poprawnie z Unicode:
GNU sed 4.2.2 działa :
$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ
bash 4.2.45 deklaruj nie działa:
$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą
Rozszerzenie parametrów bash 4.2.45 nie działa:
$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą
bash 4.3.42 declare
i prace nad rozszerzaniem parametrów :
$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką
GNU tr 8.20 nie działa:
$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą
mawk (domyślny awk w Ubuntu 13.10) nie działa:
$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą
gawk działa :
$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ
Perl pure uc () nie działa:
$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą
Python 2 bez wskazówek Unicode nie działa:
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą
Python 2 po otrzymaniu instrukcji obsługi Unicode działa :
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ
Python 3 działa :
$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
gawk
jako domyślny awk (jak pokazano za pomocą update-alternatives --display awk
). Czy na pewno mawk
jest to domyślna wersja 13.10?
sed
s od 1990 r. obsługują tę \U
opcję ;-). Nie jest to cecha charakterystyczna dla gnu-sed. W przeciwnym razie świetna odpowiedź, tyle opcji, tak mało czasu ;-) Powodzenia dla wszystkich!
uc
nie działa w Perlu, ponieważ musisz use Encode
lub use utf8
. Przepisz swój przykład jako echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'
i będzie działać. Zobacz także stackoverflow.com/a/13261662/3701431
Użyłbym wewnętrznego zestawu poleceń bash lub deklaracji, aby zdefiniować zmienną pisaną małymi literami.
$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case
Znaki są obniżane, gdy wartość jest ustawiona, a nie podczas wpisywania zmiennej. Dlatego lepiej jest pisać na początku skryptu. Dla wielkich liter możesz wpisać -u .
$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE
Nie jest to specyficzne dla powłoki bash, która działa również na ksh, być może w definicji powłoki POSIX.
EDYCJA: Wiele osób delikatnie wskazało mi, że składanie jest teraz uważane za przestarzałe w bash i zastępowane przez deklaracja . Oba polecenia są równoważne.
$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
Set variable values and attributes.
Obsolete. See `help declare'.
$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
Set variable values and attributes.
Sam nadal używam składni składu podczas pracy w heterogenicznym środowisku, więc nie muszę przepisywać skryptów.
typeset
uważa się ją za deprecjonowaną i zastąpioną przezdeclare
Możesz to zrobić za pomocą tr
polecenia.
W terminalu ( Ctrl+ Alt+ T)
To polecenie:
echo 'String here' | tr "[:lower:]" "[:upper:]"
konwertuje małe litery na wielkie.
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
konwertuje wielkie litery na małe.
Przykład:
Kredyt trafia do cybercity
tr A-Z a-z
będzie działać.
To nie jest proste rozwiązanie, ale możesz przepuścić łańcuchy perl
(tak jak zrobił to Olised
):
$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE
I \L
będzie miał odwrotny skutek:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Użyj tego prostego polecenia Dla wielkich i małych liter Gdzie „f” to nazwa pliku, w którym chcesz dokonać konwersji.
tr "A-Z" "a-z" < f
Do małych i wielkich liter
tr "a-z" "A-Z" < f