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

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


4
POSIX-ly จะนับจำนวนบรรทัดในตัวแปรสตริงได้อย่างไร
ฉันรู้ว่าฉันสามารถทำได้ใน Bash: wc -l <<< "${string_variable}" โดยพื้นฐานแล้วทุกสิ่งที่ฉันพบเกี่ยวข้องกับ<<<ตัวดำเนินการ Bash แต่ใน POSIX shell <<<นั้นไม่ได้ถูกกำหนดและฉันไม่สามารถหาวิธีอื่นได้เป็นเวลาหลายชั่วโมง ฉันค่อนข้างแน่ใจว่ามีวิธีแก้ปัญหาอย่างง่าย แต่น่าเสียดายที่ฉันไม่พบมัน

6
ทุบตีหาบรรทัดที่ขึ้นต้นด้วยสตริง
ฉันมีไฟล์หลายไฟล์และต้องการค้นหาว่าไฟล์ใดมีบรรทัดเรียงตามลำดับที่ขึ้นต้นด้วยสตริงที่แน่นอน ตัวอย่างเช่นสำหรับไฟล์ต่อไปนี้: Aaaaaaaaaaaa Baaaaaaaaaaa Cxxxxxxxxx Cyyyyyyyyy Czzzzzzzzz Abbbbbbbbbbb Bbbbbbbbbbbb Caaaaaa Accccccccccc Bccccccccccc Cdddddd Ceeeeee มีมากกว่าหนึ่งบรรทัดที่ขึ้นต้นด้วย 'C' ดังนั้นฉันต้องการให้ไฟล์นี้ถูกค้นพบโดยคำสั่ง ตัวอย่างเช่นสำหรับไฟล์ต่อไปนี้: Aaaaaaaaaaaa Baaaaaaaaaaa Cxxxxxxxxx Abbbbbbbbbbb Bbbbbbbbbbbb Caaaaaa Accccccccccc Bccccccccccc Cdddddd มีหนึ่งบรรทัดที่ขึ้นต้นด้วย 'C' เสมอฉันไม่ต้องการไฟล์นี้ ฉันคิดว่าจะใช้ a grepหรือ a sedแต่ฉันไม่รู้วิธีการใช้ อาจใช้ regexp ^C.*$^Cหรืออะไรทำนองนั้น ความคิดใด ๆ
10 bash  sed  grep  string 

5
การจับคู่รูปแบบกับชื่อพา ธ ใน bash
ฉันต้องการดำเนินการกับรายการไดเรกทอรีย่อยในไดเรกทอรี พิจารณา: for x in x86-headers/*/C/populate.sh; do echo $x; done สิ่งนี้จะช่วยให้ x86-headers/elf/C/populate.sh x86-headers/gl/C/populate.sh x86-headers/gmp/C/populate.sh x86-headers/gnome2/C/populate.sh x86-headers/gtk2/C/populate.sh x86-headers/jni/C/populate.sh x86-headers/libc/C/populate.sh แต่ฉันต้องการค่าที่สอดคล้องกับส่วนที่สองของเส้นทาง elf, glฯลฯ x86-headersฉันรู้วิธีการเปลื้องผ้าชั้นนำ for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done ซึ่งจะช่วยให้ elf/C/populate.sh gl/C/populate.sh gmp/C/populate.sh gnome2/C/populate.sh gtk2/C/populate.sh jni/C/populate.sh libc/C/populate.sh ฉันรู้วิธีถอดคำศัพท์ในภายหลังในเส้นทางด้วย เช่นลงไปหนึ่งระดับ: cd x86-headers for x in */C/populate.sh; do i=${x%%/*}; echo …

3
รับส่วนสุดท้ายของสตริงหลังจากยัติภังค์
มีบรรทัดคำสั่งง่าย ๆ ในการแยกส่วนสุดท้ายของสตริงที่คั่นด้วยเครื่องหมายขีดคั่นหรือไม่ เช่นผมต้องการที่จะแยกจาก123foo-bar-123

2
สร้างคำสั่งแบบไดนามิก
ฉันกำลังทำงานกับสคริปต์และฉันต้องสร้างtarคำสั่งแบบไดนามิก ต่อไปนี้เป็นสองตัวอย่างเพื่ออธิบายสิ่งที่ฉันพยายามทำ: #!/bin/bash TAR_ME="/tmp" EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*") _tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" echo -e "\n\nNEXT:\n\n" EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*") _tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" ฉันต้องการที่จะใช้_tarเป็นคำสั่งฉันสามารถทำให้มันทำงานกับเส้นทางแบบคลาสสิก แต่ฉันต้องการมันเพื่อทำงานกับช่องว่างในชื่อโฟลเดอร์ และทุกครั้งที่ฉันพบข้อผิดพลาดที่มีลักษณะ: COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*" …

4
แยกสตริงบนโคลอนใน / bin / sh
dashสคริปต์ของฉันใช้พารามิเตอร์ในรูปแบบของhostname:portคือ: myhost:1234 ในขณะที่พอร์ตเป็นทางเลือกเช่น: myhost ฉันต้องอ่านโฮสต์และพอร์ตเป็นตัวแปรแยกต่างหาก ในกรณีแรกฉันทำได้: HOST=${1%%:*} PORT=${1##*:} แต่นั่นจะไม่ทำงานในกรณีที่สองเมื่อพอร์ตถูกละเว้น echo ${1##*:}เพียงแค่ส่งคืนชื่อโฮสต์แทนที่จะเป็นสตริงว่าง ใน Bash ฉันสามารถทำได้: IFS=: read A B <<< asdf:111 dashแต่นั่นไม่ได้ทำงานใน ฉันสามารถแยกสตริงบน:ในประโดยไม่ต้องเรียกใช้โปรแกรมภายนอก ( awk, trฯลฯ )?
9 shell  string  dash 

5
วิธีย่อ / path / to / file ไปยัง / p / t / file
ฉันกำลังมองหาซับในที่สง่างาม (เช่นawk) ที่จะทำให้สตริงของเส้นทาง Unix สั้นลงโดยใช้อักขระตัวแรกของผู้ปกครองแต่ละคน / ระดับกลาง แต่เป็นชื่อเต็ม ง่ายต่อการแสดงโดยตัวอย่าง: /path/to/file → /p/t/file /tmp → /tmp /foo/bar/.config/wizard_magic → /f/b/./wizard_magic /foo/bar/.config/wizard_magic→ /f/b/.c/wizard_magic จากจุดที่ดีโดย @ MichaelKjörlingและ @ChrisH ด้านล่างตัวอย่างนี้แสดงให้เห็นว่าเราจะแสดงตัวละครสองตัวแรกอย่างไรเมื่อตัวอักษรตัวแรกเป็นจุด
9 sed  awk  string 

4
วิธียืนยันว่าสตริงมีอักขระขึ้นบรรทัดใหม่และหากเป็นเช่นนั้นให้ลบออก
ฉันมีสตริงที่เป็นผลมาจากการดำเนินการบางอย่างที่ฉันไม่สามารถควบคุมได้ เมื่อฉันพิมพ์ตัวแปรนี้โดยใช้echoฉันได้รับ: echo $myvar hello อย่างไรก็ตามเมื่อฉันทำ if [ $myvar = "hello" ]; then echo they are equal else echo they are not equal fi ฉันได้เสมอว่าพวกเขาไม่เท่ากัน ฉันสงสัยว่านี่เป็นเพราะnewlineตัวละคร สตริงยังมีพฤติกรรมที่แปลกด้วย เมื่อฉันทำ: newVAR="this is my var twice: "$myvar$myvar echo $newVAR ฉันเข้าใจ: hellois my var twice: hello ฉันจะตรวจสอบได้อย่างไรว่านี่เป็นเรื่องจริงเนื่องจาก a newlineและถ้าใช่ให้ลบออก
9 bash  string 

2
Piping string manipulation
ฉันได้อ่านคำถามเกี่ยวกับการจัดการสตริงทุบตี bash อื่น ๆ แต่ดูเหมือนจะเป็นแอปพลิเคชันพิเศษ เป็นหลักมีวิธีการทำด้านล่างง่ายขึ้น? แทน $ string='hello world'; string2="${string// /_}"; echo "${string2^^}" HELLO_WORLD สิ่งที่ต้องการ $ echo 'hello world' | $"{-// /_}" | "${ -^^}" HELLO_WORLD แก้ไขฉันสนใจที่จะอยู่ในการควบคุมของ bash หากเป็นไปได้เพื่อรักษาความเร็ว (ตรงข้ามกับ sed / awk ซึ่งมีแนวโน้มที่จะทำให้สคริปต์ของฉันช้าลงอย่างมาก) แก้ไข 2: @jimmij ฉันชอบตัวอย่างที่สองและทำให้ฉันทำฟังก์ชั่น bash_m() { { read x; echo "${x// /_}"; } | { …

2
grep ตัวละครโดยรอบของการแข่งขัน
ฉันต้องการค้นหาและแทนที่ภายในฐานข้อมูลขนาดใหญ่และมันไม่ได้ทำในสิ่งที่ฉันคิดว่าควรจะเกิดขึ้น ฉันต้องการ grep สำหรับสตริงเป้าหมายของฉันในไฟล์แล้วดูอักขระ 8 ตัวหรือมากกว่านั้น (ฉันอาจต้องปรับตัวเลขนั้นขึ้นอยู่กับ) ฉันจะทำสิ่งนั้นได้อย่างไร เหตุผลที่ฉันไม่สามารถดูลูกตานี้ได้เพราะมีหลายร้อยถ้าไม่ตรงกัน ฉันต้องการได้รับจำนวนอักขระรอบ ๆ สตริงและจากนั้นสอดเข้าไปuniqหรือเพื่อดูว่าทำไมการค้นหาและแทนที่ของฉันจึงมีพฤติกรรมที่ไม่คาดคิด นอกจากนี้ยังสามารถมีการแข่งขันหลายรายการในบรรทัดเดียวกัน!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.