ฉันจะแทนที่สตริงต่อไปนี้ได้อย่างไร
hd_ma_prod_customer_ro:*:123456789:john.doe
กับ john.doe
โดยทั่วไปฉันต้องการค้นหาเครื่องหมายจุดคู่สุดท้าย (:) และลบทุกอย่างก่อนหน้าและรวมไว้ด้วย
ฉันจะแทนที่สตริงต่อไปนี้ได้อย่างไร
hd_ma_prod_customer_ro:*:123456789:john.doe
กับ john.doe
โดยทั่วไปฉันต้องการค้นหาเครื่องหมายจุดคู่สุดท้าย (:) และลบทุกอย่างก่อนหน้าและรวมไว้ด้วย
คำตอบ:
สมมติว่าคุณหมายถึงอะไรจริง ๆ คือคุณต้องการลบทุกอย่างจนถึงโคลอนสุดท้ายและjohn.doe
คงสภาพเดิมเอาไว้:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
บรรทัดแรกเป็นเพียงท่อสตริงทดสอบเพื่อsed
เป็นตัวอย่าง
ประการที่สองคือพื้นฐานเปลี่ยนตัวsed
ส่วนที่หนึ่งและที่สอง/
คือ regex เพื่อค้นหาและส่วนที่สองและสามคือสิ่งที่จะแทนที่ด้วย (ไม่มีอะไรในกรณีนี้ในขณะที่เรากำลังลบ)
สำหรับ regex .
จับคู่อักขระใด ๆ*
ทำซ้ำจำนวนเท่านี้ (รวมถึงศูนย์) และ:
จับคู่โคลอน ดังนั้นจึงเป็นสิ่งที่มีประสิทธิภาพตามด้วยลำไส้ เนื่องจาก.*
สามารถรวมเครื่องหมายโคลอนการแข่งขันคือ 'โลภ' และรวมทุกอย่างจนถึงโคลอนสุดท้าย
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
ฉันกำลังแทนที่การเกิดขึ้นทั้งหมดของ:ด้วยแท็บและจากนั้นใช้awk
เพื่อแยกสตริง john.doe
หากคุณไม่มีไฟล์คุณสามารถลองสิ่งนี้
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
ตามความเห็นของ Graeme เราสามารถใช้awk
พิมพ์คอลัมน์สุดท้ายเพียงอย่างเดียวโดยใช้NF
ตัวแปรawk
ดังนี้
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
การรวมข้อคิดเห็นของ Graeme เพื่อกำจัดสิ่งที่ไม่จำเป็น sed
คำสั่งสามารถแก้ไขได้ดังต่อไปนี้
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
awk
ฉันยังไม่ได้ว่าสะดวกสบายด้วย โดยพื้นฐานแล้วฉันพยายามทดสอบคำสั่งที่ฉันได้รับในตอนแรกและพยายามแก้ไขตามความต้องการของผู้ใช้ :)
-F
ตัวเลือกสำหรับการawk
ระบุตัวคั่นสนาม หากคุณบอกawk
ให้ใช้โคลอนคุณไม่จำเป็นต้องแทนที่โคลอนด้วยแท็บ นอกจากนี้หากคุณต้องการได้รับเขตข้อมูลสุดท้ายที่คุณสามารถใช้$NF
แทนได้$4
สิ่งนี้จะใช้ได้ถ้าไม่มีโคลอน 3 ตัวเสมอ
วิธีอื่นโดยใช้awk
:
awk -F: '{ print $NF }'
โปรดลอง
แก้ไข: ลบสมอแล้ว
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
และเพื่อลบ
echo 'abc:fjk' |sed 's/.*://g'
^
สมอทำให้ไม่แตกต่างในทั้งสองกรณีคำถามหรือในกรณีตัวอย่างของคุณ จุดเริ่มต้นอยู่ใด ๆ ที่มีอยู่แล้วหมายถึง/.*
^
awk
ทำไมไม่ทำawk -F:
?