ฉันจะแทนที่สตริงต่อไปนี้ได้อย่างไร
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:?