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.
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.
Câu trả lời:
Nếu chuỗi đã được lưu trữ trong một biến, bạn có thể sử dụng bash
mở rộng tham số, cụ thể ${parameter,,pattern}
(có sẵn từ bash 4.0), parameter
tên của biến của bạn pattern
là 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 bash
cú 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: " zsh
cú pháp không hoạt độngbash
.
${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:]')
.
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 declare
và cô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Ą
gawk
awk mặc định (như được hiển thị với update-alternatives --display awk
). Bạn có chắc chắn mawk
là mặc định trong 13.10?
sed
s từ năm 1990 đã hỗ trợ \U
tù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ả!
uc
không hoạt động trong Perl vì bạn phải use Encode
hoặ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
Tôi sẽ sử dụng bộ gõ 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.
typeset
được coi là depricated và thay thế bằngdeclare
Bạn có thể làm điều đó với tr
lệ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ụ:
Tín dụng cho cộng đồng mạng
tr A-Z a-z
cũng sẽ làm việc.
Đâ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
Và \L
sẽ có tác dụng ngược lại:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
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