คำสั่ง Bash ที่ฉันสามารถใช้เพื่อแปลงสตริงตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กและในทางกลับกันคืออะไร
ขอขอบคุณ.
คำสั่ง Bash ที่ฉันสามารถใช้เพื่อแปลงสตริงตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กและในทางกลับกันคืออะไร
ขอขอบคุณ.
คำตอบ:
หากสตริงนั้นถูกเก็บไว้ในตัวแปรแล้วคุณสามารถใช้bash
การขยายพารามิเตอร์ได้โดยเฉพาะ${parameter,,pattern}
(มีให้ตั้งแต่ bash 4.0) ซึ่งparameter
เป็นชื่อของตัวแปรของคุณและpattern
มีการ ommitted:
$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!
โปรดทราบว่าสิ่งนี้จะไม่เปลี่ยนค่าของตัวแปรเพียงการส่งออก ในการเปลี่ยนตัวแปรคุณต้องกำหนดค่าใหม่:
$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!
การแปลงตัวพิมพ์ใหญ่ทำงานได้กับ${parameter^^pattern}
:
$ echo ${string^^}
HELLO, WORLD!
สิ่งนี้ใช้ได้กับสตริง Unicode (อย่างน้อยกับเวอร์ชั่นทุบตีปัจจุบันอาจต้องการอย่างน้อยทุบตี 4.3):
$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ
หากคุณกำลังใช้zsh
คุณสามารถใช้พารามิเตอร์การขยายธง ( ${(FLAGS)NAME}
; มีให้ตั้งแต่ zsh 2.5) เพื่อให้ได้ผลลัพธ์เดียวกัน bash
ไวยากรณ์ไม่ทำงานใน1)zsh
ธงสำหรับกรณีที่ต่ำกว่าคือL
; สำหรับกรณีบนมันคือU
:
$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"
สิ่งนี้ยังทำงานกับสตริง Unicode (อย่างน้อยก็ตั้งแต่ zsh 5.0; ฉันไม่ได้ลองกับเวอร์ชั่นก่อนหน้า):
$ string='ἈΛΦΆβητος'
$ echo ${(L)string}
ἀλφάβητος
$ echo ${(U)string}
ἈΛΦΆΒΗΤΟΣ
1)ถึงแม้ว่าจะเห็นว่ามี zsh นี้มานานก็อาจจะเป็น: ที่"zsh
bash
ไวยากรณ์ไม่ทำงานใน
${string,,}
สัญกรณ์เท่านั้นที่มีอยู่สำหรับรุ่นทุบตี 4+ มิฉะนั้นหนึ่งของการแก้ปัญหาอื่น ๆ $(echo $string | tr '[:upper:]' '[:lower:]')
ที่จำเป็นเช่น
มีวิธีการน้อยมากที่ทำงานอย่างถูกต้องกับ Unicode:
GNU sed 4.2.2 ทำงานได้ :
$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ
ทุบตี 4.2.45 ประกาศไม่ทำงาน:
$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą
การขยายพารามิเตอร์ bash 4.2.45 ไม่ทำงาน:
$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą
bash 4.3.42 declare
และงานส่วนขยายพารามิเตอร์:
$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką
GNU tr 8.20 ไม่ทำงาน:
$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą
mawk (awk เริ่มต้นใน Ubuntu 13.10) ไม่ทำงาน:
$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą
เพ่งพิศทำงาน :
$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ
Perl pure uc () ไม่ทำงาน:
$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą
Python 2 ที่ไม่มีคำใบ้ Unicode ไม่ทำงาน:
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą
Python 2 เมื่อได้รับคำสั่งให้จัดการกับ Unicode ให้ทำงาน :
$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ
Python 3 ใช้งานได้ :
$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
gawk
ค่าเริ่มต้น awk (ดังที่แสดงด้วยupdate-alternatives --display awk
) คุณแน่ใจหรือว่าmawk
เป็นค่าเริ่มต้นใน 13.10
sed
s ตั้งแต่ปี 1990 ได้สนับสนุน\U
ตัวเลือก ;-) ไม่ใช่คุณสมบัติเฉพาะของ gnu-sed มิฉะนั้นคำตอบที่ดีตัวเลือกมากมายเวลาน้อยมาก ;-) ขอให้โชคดีสำหรับทุกคน!
uc
ไม่ทำงานใน Perl เพราะคุณจะต้องหรือuse Encode
use utf8
เขียนตัวอย่างของคุณอีกครั้ง echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'
และมันจะทำงาน โปรดดู stackoverflow.com/a/13261662/3701431
ฉันจะใช้ bash internal เรียงพิมพ์หรือประกาศคำสั่งเพื่อกำหนดตัวแปรตัวพิมพ์เล็ก
$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case
ตัวอักษรจะลดลงเมื่อมีการตั้งค่าไม่ใช่เมื่อคุณพิมพ์ชุดตัวแปร ดังนั้นจึงเป็นการดีกว่าที่จะเรียงพิมพ์ที่จุดเริ่มต้นของสคริปต์ สำหรับพิมพ์ใหญ่คุณสามารถเรียงพิมพ์ -u
$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE
นี่ไม่ใช่เฉพาะสำหรับ bash shell ที่ใช้กับ ksh ได้ด้วยอาจจะอยู่ในคำนิยามเชลล์ POSIX
แก้ไข: หลายคนชี้ให้ฉันเบา ๆ ความจริงที่ว่าเรียงพิมพ์ขณะนี้ถือว่าล้าสมัยในทุบตีและถูกแทนที่ด้วยประกาศ ทั้งสองคำสั่งนั้นเทียบเท่ากัน
$ 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.
ฉันเองยังคงใช้ไวยากรณ์เรียงพิมพ์ขณะที่ฉันทำงานกับสภาพแวดล้อมที่แตกต่างกันดังนั้นฉันจึงไม่ต้องเขียนสคริปต์ใหม่
typeset
ถือว่า depricated และถูกแทนที่ด้วยdeclare
คุณสามารถทำได้ด้วยtr
คำสั่ง
ในอาคารผู้โดยสาร ( Ctrl+ Alt+ T)
คำสั่งนี้:
echo 'String here' | tr "[:lower:]" "[:upper:]"
จะแปลงเป็นตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
จะแปลงเป็นตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก
ตัวอย่าง:
เครดิตไปสู่โลกไซเบอร์
tr A-Z a-z
จะทำงานได้ดี
คุณสามารถทำสิ่งต่าง ๆ ผ่านsed
:
$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE
และ\L
จะมีผลตรงกันข้าม:
$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
มันไม่ใช่วิธีการทุบตีบริสุทธิ์ แต่คุณสามารถไปป์ไลน์ของคุณได้perl
(เหมือนที่ Oliทำกับsed
):
$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE
และ\L
จะมีผลตรงกันข้าม:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
ใช้คำสั่งง่าย ๆ นี้สำหรับตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กโดยที่ 'f' คือชื่อไฟล์ที่คุณต้องการแปลง
tr "A-Z" "a-z" < f
สำหรับกรณีที่ต่ำกว่าถึงบน
tr "a-z" "A-Z" < f