ฉันจะลบข้อความทั้งหมดหลังจากตัวละครในกรณีนี้เครื่องหมายโคลอน (":") เป็นทุบตีได้อย่างไร ฉันสามารถนำโคลอนออกด้วยหรือไม่ ฉันไม่รู้จะทำยังไง
ฉันจะลบข้อความทั้งหมดหลังจากตัวละครในกรณีนี้เครื่องหมายโคลอน (":") เป็นทุบตีได้อย่างไร ฉันสามารถนำโคลอนออกด้วยหรือไม่ ฉันไม่รู้จะทำยังไง
คำตอบ:
ตัวอย่างอาจมีประโยชน์ แต่ถ้าฉันเข้าใจคุณถูกต้องสิ่งนี้จะใช้ได้:
echo "Hello: world" | cut -f1 -d":"
สิ่งนี้จะแปลง "hello: world" เป็น "hello"
basename
และcut
ดูคำตอบของ Dennis ด้านล่าง
cut
สามารถอ่านได้จาก stdin ดังนั้นจึงเป็นการดีกว่าโดยเฉพาะเมื่อคุณมีสตริงที่ยาวมากซึ่งคุณต้องดำเนินการเช่นเนื้อหาของไฟล์
hello: world
อย่างไร นี่คือคำตอบครึ่งหนึ่ง
ใน Bash (และ ksh, zsh, dash ฯลฯ ) คุณสามารถใช้การขยายพารามิเตอร์%
ที่จะลบอักขระออกจากจุดสิ้นสุดของสตริงหรือ#
ซึ่งจะลบอักขระจากจุดเริ่มต้นของสตริง หากคุณใช้หนึ่งในอักขระเหล่านั้นสตริงการจับคู่ที่เล็กที่สุดจะถูกลบออก หากคุณเพิ่มตัวละครเป็นสองเท่าตัวละครที่ยาวที่สุดจะถูกลบออก
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:world
จะกลายเป็นhello:wo
โดยใช้${a%:*}
?
"${a##*:}"
เฉพาะการtomorrow
= เท่านั้น
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
; [[$ a = ~ $ รูปแบบ]]; echo "$ {BASH_REMATCH [1]}" ` ที่ตรงกับถ้ามีลำไส้ใหญ่ หากคุณต้องการให้เป็นตัวเลือกรูปแบบอื่นจะต้องมีการใช้ คำอธิบายของ Bash regexes (และ regexes โดยทั่วไป) อยู่นอกเหนือขอบเขตของความคิดเห็นเหล่านี้ คุณสามารถค้นหาคำถามอื่น ๆ ที่พูดถึงเรื่องนี้หรือโพสต์ของคุณเอง
$ echo 'hello:world:again' |sed 's/:.*//'
hello
egrep -o '^[^:]*:'
egrep
เป็น grep -E
กับ grep
มันทำให้ไม่แตกต่างจากที่นี่เป็นประจำ -o
สั่งให้ grep พิมพ์เฉพาะส่วนของบรรทัดที่ตรงกับนิพจน์เท่านั้น ^
ยึดการจับคู่กับจุดเริ่มต้นของบรรทัด [^:]*
จับคู่อักขระศูนย์หรือมากกว่านั้นไม่ใช่:
อักขระ ตรงกับตัวอักษร:
:
สมมติว่าคุณมีเส้นทางพร้อมไฟล์ในรูปแบบนี้:
/dirA/dirB/dirC/filename.file
ตอนนี้คุณต้องการเส้นทางที่มีสี่ "/" เท่านั้น ชนิด
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
และผลลัพธ์ของคุณจะเป็น
/dirA/dirB/dirC
ข้อดีของการใช้การตัดคือคุณยังสามารถตัดออกไดเรกทอรีที่ดีที่สุดเช่นเดียวกับไฟล์ (ในตัวอย่างนี้) ดังนั้นหากคุณพิมพ์
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
ผลลัพธ์ของคุณจะเป็น
/dirA/dirB
แม้ว่าคุณจะสามารถทำสิ่งเดียวกันจากอีกด้านหนึ่งของสตริงได้ แต่มันก็ไม่สมเหตุสมผลนักในกรณีนี้เมื่อพิมพ์
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
ผลลัพธ์ใน
dirA/dirB/dirC
ในบางกรณีกรณีสุดท้ายอาจเป็นประโยชน์เช่นกัน โปรดทราบว่าไม่มี "/" ที่จุดเริ่มต้นของเอาต์พุตล่าสุด
ตัดทุกอย่างหลังจากอินสแตนซ์สุดท้ายของ ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
และถ้าคุณต้องการที่จะลดลงล่าสุด ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: คุณต้องการแทนที่:
ด้วย/
(ซึ่งควรเป็นเครื่องหมายโคลอน\/
)
cut
ทำงานได้ แต่คำตอบของเดนนิสดีกว่าและยืดหยุ่นกว่า ไม่มีใครรู้ว่ามันจะวางกระบวนการใหม่เช่นนั้นcut
หรือไม่?