คำถามติดแท็ก string

การจัดการสตริง: การแยกส่วนของสตริงการแทนที่ข้อความการจัดรูปแบบความกว้างที่กำหนดเป็นต้น

2
เชลล์อื่นที่ไม่ใช่ Bash และ Zsh สนับสนุนการอ้างอิง ANSI-C หรือไม่ เช่น $ 'string'
ฉันมีเชลล์สคริปต์ที่ใช้สิ่งต่อไปนี้เพื่อพิมพ์เครื่องหมายถูกสีเขียวในผลลัพธ์: col_green="\e[32;01m" col_reset="\e[39;49;00m" echo -e "Done ${col_green}✓${col_reset}" หลังจากที่ได้อ่านเกี่ยวกับการทุบตีของANSI-C Quotingผมรู้ว่าผมสามารถใช้มันเมื่อตั้งค่าตัวแปรสีของฉันและเอา-eธงจากฉันก้อง col_green=$'\e[32;01m' col_reset=$'\e[39;49;00m' echo "Done ${col_green}✓${col_reset}" ดูเหมือนว่าน่าสนใจเพราะมันหมายถึงข้อความที่พิมพ์อย่างถูกต้องไม่ว่ามันจะถูกส่งผ่านไปยังเสียงสะท้อนในตัวของ Bash หรือการใช้งานภายนอก/bin/echo(ฉันใช้บน macOS) แต่สิ่งนี้ทำให้สคริปต์พกพาน้อยลงหรือไม่ ฉันรู้ว่า Bash และ Zsh สนับสนุนรูปแบบการอ้างอิงนี้ แต่ฉันไม่แน่ใจเกี่ยวกับคนอื่น

4
การแทนที่สตริง: เหตุการณ์ทั้งหมด
คำถามง่ายๆ แต่ฉันไม่สามารถหาคำตอบได้ เอกสาร zsh ครอบงำฉัน :-( function z () { echo ${1:s/the/THE} } $ z thethethe THEthethe ... ฉันจะให้ 'the' ทั้งหมดถูกแทนที่ด้วย 'THE' ได้อย่างไรไม่ใช่แค่สิ่งที่เกิดขึ้นครั้งแรก ด้วย zsh มันเป็นสิ่งที่ง่ายที่สุดที่ดูเหมือนจะหาได้ยากที่สุด
13 zsh  string 

4
วิธีการแยกสตริงในสองสตริงย่อยที่มีความยาวเท่ากันโดยใช้ bash
ฉันต้องการแยกสตริงออกเป็นสองส่วนและพิมพ์ตามลำดับ ตัวอย่างเช่น: abcdef เข้าไป abc def มีวิธีง่าย ๆ ที่จะทำหรือต้องการการประมวลผลสตริง?
12 bash  string 

6
การเติมช่องว่างที่ต่อท้ายในสตริงด้วยอักขระอื่น
ฉันต้องการส่งออกhello worldมากกว่า 20 ตัวอักษร printf "%-20s :\n\n" 'hello world!!' # Actual output hello world!! : # Wanted output hello world!!========: อย่างไรก็ตามฉันไม่ต้องการใช้ช่องว่าง แต่ใช้ " = " แทน ฉันจะทำอย่างไร
12 bash  shell  string  printf 

3
คุณจะลบอักขระ dot ออกจากสตริงโดยไม่เรียกใช้ sed หรือ awk อีกครั้งได้อย่างไร
ฉันมีไฟล์ชื่อhostlist.txtที่มีข้อความเช่นนี้: host1.mydomain.com host2.mydomain.com anotherhost www.mydomain.com login.mydomain.com somehost host3.mydomain.com ฉันมีสคริปต์เล็ก ๆ ต่อไปนี้: #!/usr/local/bin/bash while read host; do dig +search @ns1.mydomain.com $host ALL \ | sed -n '/;; ANSWER SECTION:/{n;p;}'; done <hostlist.txt \ | gawk '{print $1","$NF}' >fqdn-ip.csv ซึ่งส่งออกไปที่fqdn-ip.csv: host1.mydomain.com.,10.0.0.1 host2.mydomain.com.,10.0.0.2 anotherhost.internal.mydomain.com.,10.0.0.11 www.mydomain.com.,10.0.0.10 login.mydomain.com.,10.0.0.12 somehost.internal.mydomain.com.,10.0.0.13 host3.mydomain.com.,10.0.0.3 คำถามของฉันคือฉันจะลบ.ก่อนจุลภาคโดยไม่ต้องกล่าวอ้างsedหรือgawkอีกครั้งหรือไม่ มีขั้นตอนที่ฉันสามารถแสดงในสายที่มีอยู่sedหรือgawkสายที่จะตัดจุดได้หรือไม่? hostlist.txt จะมีโฮสต์ 1,000 แห่งดังนั้นฉันต้องการให้สคริปต์ของฉันเร็วและมีประสิทธิภาพ

7
/ bin / dash: ตรวจสอบว่า $ 1 เป็นตัวเลขหรือไม่
อะไรจะเป็นวิธีที่ดีที่สุดในการตรวจสอบว่า $ 1 เป็นจำนวนเต็มใน / bin / dash หรือไม่ ในทุบตีฉันสามารถทำ: [[ $1 =~ ^([0-9]+)$ ]] แต่ดูเหมือนจะไม่เป็นไปตาม POSIX และ dash ไม่สนับสนุนสิ่งนั้น

5
จำนวนอักขระในเอาต์พุตของคำสั่งเชลล์
ฉันกำลังเขียนบทซึ่งความต้องการในการคำนวณจำนวนตัวอักษรในการส่งออกคำสั่งในขั้นตอนเดียว ตัวอย่างเช่นการใช้คำสั่งreadlink -f /etc/fstabควรส่งคืน10เนื่องจากผลลัพธ์ของคำสั่งนั้นมีความยาว 10 อักขระ สิ่งนี้สามารถเกิดขึ้นได้กับตัวแปรที่เก็บไว้โดยใช้รหัสต่อไปนี้: variable="somestring"; echo ${#variable}; # 10 น่าเสียดายที่การใช้สูตรเดียวกันกับสตริงที่สร้างคำสั่งไม่ทำงาน: ${#(readlink -f /etc/fstab)}; # bash: ${#(readlink -f /etc/fstab)}: bad substitution ฉันเข้าใจว่าเป็นไปได้ที่จะทำสิ่งนี้โดยการบันทึกผลลัพธ์เป็นตัวแปรแรก: variable=$(readlink -f /etc/fstab); echo ${#variable}; แต่ฉันต้องการลบขั้นตอนพิเศษ เป็นไปได้ไหม ความเข้ากันได้กับ Almquist shell (sh) โดยใช้เฉพาะยูทิลิตี้ที่อยู่ในตัวหรือมาตรฐานเท่านั้น
12 shell  string  variable 

5
แทนที่สตริงหลังจากจุดสุดท้ายในทุบตี
ฉันมีรูปแบบต่อไปนี้ในสตริง (ที่อยู่ IP): 123.444.888.235 ฉันต้องการแทนที่หมายเลขสุดท้ายหลังจากจุดด้วย0ดังนั้นมันจะกลายเป็น: 123.444.888.0 ฉันจะทำในbashภาษาสคริปต์ภาษาอื่นได้อย่างไร

1
เมื่อใดที่ฉันจะแก้ไขสตริงในไบนารีที่สามารถเรียกทำงานได้
ฉันมีไบนารีที่ปฏิบัติการได้; a.outขอเรียกว่า ฉันสามารถดูไบนารีมีสตริง $ strings a.out ... /usr/share/foo .... ฉันจำเป็นต้องเปลี่ยนสายไป/usr/share/foo /usr/share/barฉันสามารถแทนที่สตริงด้วยsedหรือไม่: sed -i 's@/usr/share/foo@/usr/share/bar@' a.out นี่เป็นสิ่งที่ควรทำ สิ่งนี้จะใช้งานได้เมื่อสายไม่ยาวเท่ากันหรือไม่


3
ไปจาก String ไปยัง Array ของ "words" ใน Bash
ฉันต้องไปจากสตริงไปยังอาร์เรย์ที่แต่ละรายการเป็นแต่ละคำในสตริงนั้น ตัวอย่างเช่นเริ่มต้นด้วย: VotePedro="Vote for Pedro" ฉันต้องการอาร์เรย์: Vote For Pedro ซึ่งฉันควรจะสามารถย้ำกว่าเป็น: for i in "${votePedroArray[@]}" do ## Do something done

3
แทนที่สตริงจำนวนมากในการส่งผ่านครั้งเดียว
ฉันกำลังมองหาวิธีที่จะแทนที่สตริงตัวยึดตำแหน่งในไฟล์แม่แบบด้วยค่าที่เป็นรูปธรรมด้วยเครื่องมือ Unix ทั่วไป (ทุบตี, sed, awk, อาจ perl) เป็นสิ่งสำคัญที่การเปลี่ยนจะดำเนินการในรอบเดียวนั่นคือสิ่งที่สแกน / เปลี่ยนแล้วจะต้องไม่ถูกนำมาพิจารณาสำหรับการเปลี่ยนใหม่ ตัวอย่างเช่นความพยายามสองครั้งนี้ล้มเหลว: echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA ผลลัพธ์ที่ถูกต้องในกรณีนี้คือหลักสูตร BA โดยทั่วไปการแก้ปัญหาควรเทียบเท่ากับการสแกนอินพุตจากซ้ายไปขวาสำหรับการจับคู่ที่ยาวที่สุดไปยังสตริงการแทนที่ที่กำหนดอย่างใดอย่างหนึ่งและสำหรับการแข่งขันแต่ละครั้งทำการแทนที่และดำเนินการต่อจากจุดนั้นบนอินพุต (ไม่มี อ่านอินพุตแล้วหรือการแทนที่ที่ดำเนินการควรพิจารณาให้ตรงกัน) ที่จริงแล้วรายละเอียดไม่สำคัญเพียงแค่ว่าผลของการเปลี่ยนจะไม่ถูกนำมาพิจารณาสำหรับการทดแทนอื่นทั้งหมดหรือบางส่วน หมายเหตุฉันกำลังมองหาโซลูชันทั่วไปที่ถูกต้องเท่านั้น โปรดอย่าเสนอวิธีแก้ปัญหาที่ล้มเหลวสำหรับอินพุตบางอย่าง (ไฟล์อินพุต, ค้นหาและแทนที่คู่) แต่ไม่น่าจะเป็นไปได้
11 bash  sed  awk  string  replace 

4
ฉันจะค้นหาการทับซ้อนของสองสายในทุบตีได้อย่างไร [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Unix & Linux Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา ฉันมีสองสาย เพื่อเป็นตัวอย่างพวกเขาตั้งไว้เช่นนี้: string1="test toast" string2="test test" สิ่งที่ฉันต้องการคือการค้นหาการทับซ้อนเริ่มต้นที่จุดเริ่มต้นของสตริง ด้วยการทับซ้อนฉันหมายถึงสตริง "test t" ในตัวอย่างข้างต้นของฉัน # I look for the command command "$string1" "$string2" # that outputs: "test t" หากสตริงเป็นstring1="atest toast"; string2="test test"พวกเขาจะต้องไม่ทับซ้อนกันตั้งแต่เริ่มต้นการตรวจสอบรูปแบบจุดเริ่มต้นและ "a" string1จุดเริ่มต้นของ


7
จะหาตำแหน่งของตัวละครโดยใช้ grep ได้อย่างไร?
ฉันต้องการระบุตำแหน่งของอักขระในสตริงโดยใช้คำสั่ง grep RAMSITALSKHMAN|1223333ตัวอย่างเช่นสตริง grep -n '[^a-zA-Z0-9\$\~\%\#\^]' ฉันจะค้นหาตำแหน่งของ|ในสตริงที่กำหนดได้อย่างไร

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