Jeśli ciąg jest już zapisany w zmiennej, możesz użyć bashrozszerzenia parametrów, szczególnie ${parameter,,pattern}(dostępne od wersji bash 4.0), gdzie parameterjest nazwa twojej zmiennej i patternjest ona odrzucana:
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. bashSkładnia nie działa w zsh1) . Flaga dla małych liter to L; dla wielkich liter jest to U:
${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:]').
Quinn Comendant
40
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Ą
Na Ubuntu 13.04 mam gawkjako domyślny awk (jak pokazano za pomocą update-alternatives --display awk). Czy na pewno mawkjest to domyślna wersja 13.10?
kiri
seds od 1990 r. obsługują tę \Uopcję ;-). Nie jest to cecha charakterystyczna dla gnu-sed. W przeciwnym razie świetna odpowiedź, tyle opcji, tak mało czasu ;-) Powodzenia dla wszystkich!
W twoim przykładzie torebka ucnie działa w Perlu, ponieważ musisz use Encodelub 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
Sergiy Kolodyazhnyy
20
Użyłbym wewnętrznego zestawu poleceń bash lub deklaracji, aby zdefiniować zmienną pisaną małymi literami.
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 .
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.
+1 Niesamowite, nigdy tego nie wiedziałem! btw kilka dodatkowych informacji: przejrzałem to w instrukcji i wydaje się, że typesetuważa się ją za deprecjonowaną i zastąpioną przezdeclare
Thom
1
@thom dziękuję, wygląda na to, że bash zaczął mieć życie dalekie od „korzeni bourne shella” :)
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), gdzieparameter
jest nazwa twojej zmiennej ipattern
jest ona odrzucana:Zauważ, że to nie zmienia wartości zmiennej, tylko wynik. Aby zmienić zmienną, musisz przypisać nową wartość:
Konwersja wielkich liter działa z
${parameter^^pattern}
:Działa to również z łańcuchami Unicode (przynajmniej w obecnych wersjach bash, prawdopodobnie wymaga co najmniej bash 4.3):
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 wzsh
1) . Flaga dla małych liter toL
; dla wielkich liter jest toU
:Działa to również z łańcuchami Unicode (przynajmniej od zsh 5.0; nie próbowałem z wcześniejszymi wersjami):
1) Chociaż, widząc, że zsh miał to o wiele dłużej, prawdopodobnie powinno być: „
zsh
Składnia nie działabash
.źródło
${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 :
bash 4.2.45 deklaruj nie działa:
Rozszerzenie parametrów bash 4.2.45 nie działa:
bash 4.3.42
declare
i prace nad rozszerzaniem parametrów :GNU tr 8.20 nie działa:
mawk (domyślny awk w Ubuntu 13.10) nie działa:
gawk działa :
Perl pure uc () nie działa:
Python 2 bez wskazówek Unicode nie działa:
Python 2 po otrzymaniu instrukcji obsługi Unicode działa :
Python 3 działa :
źródło
gawk
jako domyślny awk (jak pokazano za pomocąupdate-alternatives --display awk
). Czy na pewnomawk
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ż musiszuse Encode
lubuse utf8
. Przepisz swój przykład jakoecho "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/3701431Użyłbym wewnętrznego zestawu poleceń bash lub deklaracji, aby zdefiniować zmienną pisaną małymi literami.
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 .
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.
Sam nadal używam składni składu podczas pracy w heterogenicznym środowisku, więc nie muszę przepisywać skryptów.
źródło
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:
konwertuje małe litery na wielkie.
konwertuje wielkie litery na małe.
Przykład:
Kredyt trafia do cybercity
źródło
tr A-Z a-z
będzie działać.Możesz
sed
też przepuszczać rzeczy :I
\L
będzie miał odwrotny skutek:źródło
To nie jest proste rozwiązanie, ale możesz przepuścić łańcuchy
perl
(tak jak zrobił to Olised
):I
\L
będzie miał odwrotny skutek:źródło
Użyj tego prostego polecenia Dla wielkich i małych liter Gdzie „f” to nazwa pliku, w którym chcesz dokonać konwersji.
Do małych i wielkich liter
źródło