คำสั่งในการแปลงสตริงตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กหรือไม่


47

คำสั่ง Bash ที่ฉันสามารถใช้เพื่อแปลงสตริงตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กและในทางกลับกันคืออะไร

ขอขอบคุณ.


2
เป็นไปได้เช่นเดียวกับ: unix.stackexchange.com/questions/51983/ …
Ciro Santilli 事件改造中心中心法轮功六四事件

2
โซลูชั่นมากมายที่stackoverflow.com/questions/2264428/ … ด้วยความรวดเร็วคร่าวๆดูเหมือนว่าส่วนใหญ่จะครอบคลุมที่นี่เช่นกัน
pbhj

คำตอบ:


59

หากสตริงนั้นถูกเก็บไว้ในตัวแปรแล้วคุณสามารถใช้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 นี้มานานก็อาจจะเป็น: ที่"zshbashไวยากรณ์ไม่ทำงานใน


3
${string,,}สัญกรณ์เท่านั้นที่มีอยู่สำหรับรุ่นทุบตี 4+ มิฉะนั้นหนึ่งของการแก้ปัญหาอื่น ๆ $(echo $string | tr '[:upper:]' '[:lower:]')ที่จำเป็นเช่น
Quinn Comendant

40

มีวิธีการน้อยมากที่ทำงานอย่างถูกต้องกับ 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Ą

1
บน Ubuntu 13.04 ฉันมีgawkค่าเริ่มต้น awk (ดังที่แสดงด้วยupdate-alternatives --display awk) คุณแน่ใจหรือว่าmawkเป็นค่าเริ่มต้นใน 13.10
kiri

seds ตั้งแต่ปี 1990 ได้สนับสนุน\Uตัวเลือก ;-) ไม่ใช่คุณสมบัติเฉพาะของ gnu-sed มิฉะนั้นคำตอบที่ดีตัวเลือกมากมายเวลาน้อยมาก ;-) ขอให้โชคดีสำหรับทุกคน!
shellter

นอกจากนี้ยังมีปัญหาบางอย่างเกี่ยวกับภาษาตุรกี (ประและ dotless i) เพื่อดูลิงค์เพิ่มเติมต่อไปนี้: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/ … - en.wikipedia org / wiki / Dotted_and_dotless_I
azat

ในตัวอย่างของกระเป๋า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
Sergiy Kolodyazhnyy

20

ฉันจะใช้ 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.

ฉันเองยังคงใช้ไวยากรณ์เรียงพิมพ์ขณะที่ฉันทำงานกับสภาพแวดล้อมที่แตกต่างกันดังนั้นฉันจึงไม่ต้องเขียนสคริปต์ใหม่


2
+1 ไม่น่าเชื่อฉันไม่เคยรู้เลย! BTW มีข้อมูลเสริม: ผมมองขึ้นนี้ในคู่มือและดูเหมือนว่าtypesetถือว่า depricated และถูกแทนที่ด้วยdeclare
Thom

1
@thom ขอบคุณดูเหมือนว่าทุบตีที่เริ่มต้นที่จะมีชีวิตอยู่ห่างไกลจากมัน "รากเปลือก Bourne" :)
เอ็มมานู

17

คุณสามารถทำได้ด้วยtrคำสั่ง

ในอาคารผู้โดยสาร ( Ctrl+ Alt+ T)

คำสั่งนี้:

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

จะแปลงเป็นตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่

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

จะแปลงเป็นตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก

ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

เครดิตไปสู่โลกไซเบอร์


2
หากคุณไม่สนใจสถานที่tr A-Z a-zจะทำงานได้ดี
Nick Matteo

9

คุณสามารถทำสิ่งต่าง ๆ ผ่านsed:

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

และ\Lจะมีผลตรงกันข้าม:

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

1

มันไม่ใช่วิธีการทุบตีบริสุทธิ์ แต่คุณสามารถไปป์ไลน์ของคุณได้perl(เหมือนที่ Oliทำกับsed):

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

และ\Lจะมีผลตรงกันข้าม:

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

-1

ใช้คำสั่งง่าย ๆ นี้สำหรับตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กโดยที่ 'f' คือชื่อไฟล์ที่คุณต้องการแปลง

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

สำหรับกรณีที่ต่ำกว่าถึงบน

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

1
ดังที่ระบุไว้ในความคิดเห็นเกี่ยวกับคำตอบที่เก่ากว่านี้จะไม่สามารถใช้ได้กับบางสถานที่
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.