Polecenie przekonwertowania łańcucha wielkich liter na małe litery?


47

Jakiego polecenia Bash można użyć do konwersji łańcucha wielkich liter na małe i odwrotnie?

Dziękuję Ci.



2
Wiele rozwiązań na stackoverflow.com/questions/2264428/... też. Z pobieżnym spojrzeniem wydaje się, że większość z nich również została tutaj uwzględniona.
pbhj

Odpowiedzi:


59

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:

$ 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. bashSkł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ć: zshSkładnia nie działabash .


3
${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Ą

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 declarei 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Ą

1
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!
shellter

Plus będą pewne problemy z tureckim (kropkowane i bez kropki i), aby uzyskać więcej informacji na następujące łącza: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/... - en.wikipedia. org / wiki / Dotted_and_dotless_I
azat

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.

$ 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.


2
+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” :)
Emmanuel

17

Możesz to zrobić za pomocą trpolecenia.

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:

wprowadź opis zdjęcia tutaj

Kredyt trafia do cybercity


2
Jeśli nie zależy Ci na ustawieniach regionalnych, również tr A-Z a-zbędzie działać.
Nick Matteo

9

Możesz sedteż przepuszczać rzeczy :

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

I \Lbędzie miał odwrotny skutek:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase

1

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 \Lbędzie miał odwrotny skutek:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase

-1

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

1
Jak zauważono w komentarzu do starszej odpowiedzi , nie zadziała to w niektórych lokalizacjach.
muru
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.