Lệnh chuyển đổi một chuỗi chữ hoa thành chữ thường?


47

Lệnh Bash tôi có thể sử dụng để chuyển đổi một chuỗi chữ hoa thành chữ thường và ngược lại là gì?

Cảm ơn bạn.



2
Rất nhiều giải pháp tại stackoverflow.com/questions/2264428/ . Với một cái nhìn lướt qua dường như cũng được đề cập ở đây.
pbhj

Câu trả lời:


59

Nếu chuỗi đã được lưu trữ trong một biến, bạn có thể sử dụng bashmở rộng tham số, cụ thể ${parameter,,pattern}(có sẵn từ bash 4.0), parametertên của biến của bạn patternlà gì và được thông báo:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

Lưu ý rằng điều này không thay đổi giá trị của biến, chỉ có đầu ra. Để thay đổi biến bạn phải gán giá trị mới:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

Chuyển đổi chữ hoa hoạt động với ${parameter^^pattern}:

$ echo ${string^^}
HELLO, WORLD!

Điều này cũng hoạt động với các chuỗi Unicode (ít nhất là với các phiên bản bash hiện tại, có thể cần ít nhất bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

Nếu bạn đang sử dụng zsh, bạn có thể sử dụng Cờ mở rộng tham số ( ${(FLAGS)NAME}; có sẵn từ zsh 2.5) để đạt được kết quả tương tự. Các bashcú pháp không làm việc trong zsh 1) . Cờ cho chữ thường là L; đối với chữ hoa là U:

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

Điều này cũng hoạt động với các chuỗi Unicode (ít nhất là từ zsh 5.0; tôi đã không thử với các phiên bản trước):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1) Mặc dù, thấy rằng zsh đã có điều này lâu hơn, nhưng có lẽ nên: " zshcú pháp không hoạt độngbash .


3
Các ${string,,}ký hiệu chỉ tồn tại cho phiên bản bash 4+. Nếu không, một trong những giải pháp khác là bắt buộc, chẳng hạn như $(echo $string | tr '[:upper:]' '[:lower:]').
Quinn Comendant

40

Có rất ít phương thức hoạt động chính xác với Unicode:

GNU sed 4.2.2 hoạt động :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 khai báo không hoạt động:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

bash 4.2.45 mở rộng tham số không hoạt động:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declarecông việc mở rộng tham số :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20 không hoạt động:

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (awk mặc định trong Ubuntu 13.10) không hoạt động:

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawk hoạt động :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl tinh khiết uc () không hoạt động:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

Python 2 không có bất kỳ gợi ý Unicode nào không hoạt động:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Python 2 khi được hướng dẫn xử lý Unicode hoạt động :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3 hoạt động :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ

1
Trên Ubuntu 13.04, tôi có gawkawk mặc định (như được hiển thị với update-alternatives --display awk). Bạn có chắc chắn mawklà mặc định trong 13.10?
kiri

seds từ năm 1990 đã hỗ trợ \Utùy chọn ;-). Không phải là một tính năng cụ thể gnu-sed. Nếu không, câu trả lời tuyệt vời, rất nhiều lựa chọn, rất ít thời gian ;-) Chúc may mắn cho tất cả!
shellter

Ngoài ra, sẽ có một số vấn đề với tiếng Thổ Nhĩ Kỳ (chấm và chấm i), để xem thêm các liên kết sau: - unicode.org/Public/UNIDATA/ecialCasing.txt - stackoverflow.com/questions/23524231/ tựa
azat

Trong ví dụ của bạn, ví uckhông hoạt động trong Perl vì bạn phải use Encodehoặc use utf8. Viết lại ví dụ của bạn echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'và nó sẽ hoạt động. Đồng thời xem stackoverflow.com/a/13261662/3701431
Sergiy Kolodyazhnyy

20

Tôi sẽ sử dụng bộ nội bộ bash hoặc lệnh khai báo để xác định một biến chữ thường.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

Các ký tự được hạ xuống khi giá trị được đặt, không phải khi bạn sắp xếp biến. Vì vậy, tốt hơn là sắp chữ ở đầu tập lệnh. Đối với chữ hoa bạn có thể gõ -u .

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

Điều này không đặc trưng cho bash shell, cũng hoạt động trên ksh, có thể là theo định nghĩa shell POSIX.

EDIT: Nhiều người nhẹ nhàng chỉ cho tôi thực tế rằng kiểu chữ hiện được coi là lỗi thời trên bash và được thay thế bằng khai báo . Cả hai lệnh đều tương đương.

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

Bản thân tôi vẫn sử dụng cú pháp sắp chữ khi tôi làm việc trên môi trường không đồng nhất, vì vậy tôi không phải viết lại các tập lệnh của mình.


2
+1 Thật đáng kinh ngạc, tôi không bao giờ biết điều đó! btw một số thông tin thêm: Tôi nhìn lên này trong cuốn hướng dẫn và có vẻ như typesetđược coi là depricated và thay thế bằngdeclare
thom

1
@thom cảm ơn bạn, có vẻ như bash bắt đầu có một cuộc sống khác xa với "rễ vỏ bourne" của nó :)
Emmanuel

17

Bạn có thể làm điều đó với trlệnh.

Trong thiết bị đầu cuối ( Ctrl+ Alt+ T)

Lệnh này:

echo 'String here' | tr "[:lower:]" "[:upper:]"

sẽ chuyển đổi chữ thường thành chữ hoa

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

sẽ chuyển đổi chữ hoa thành chữ thường.

Thí dụ:

nhập mô tả hình ảnh ở đây

Tín dụng cho cộng đồng mạng


2
Nếu bạn không quan tâm đến địa phương, tr A-Z a-zcũng sẽ làm việc.
Nick Matteo

9

Bạn cũng có thể chuyển mọi thứ qua sed:

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

\Lsẽ có tác dụng ngược lại:

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

1

Đây không phải là một giải pháp bash thuần túy, nhưng bạn có thể dẫn các chuỗi của bạn đi qua perl(như Oli đã làm với sed):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

\Lsẽ có tác dụng ngược lại:

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

-1

Sử dụng lệnh đơn giản này Đối với chữ hoa và chữ thường Trong đó 'f' là tên tệp mà bạn muốn thực hiện chuyển đổi.

tr "A-Z" "a-z" < f

Đối với chữ thường

tr "a-z" "A-Z" < f

1
Như đã lưu ý trong một nhận xét về một câu trả lời cũ hơn , điều này sẽ không hiệu quả đối với một số địa phương.
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.