วิธีใช้ Sed เพื่อแทนที่อักขระทั้งหมดก่อนหน้าโคลอน


25

ฉันจะแทนที่สตริงต่อไปนี้ได้อย่างไร

hd_ma_prod_customer_ro:*:123456789:john.doe

กับ john.doe

โดยทั่วไปฉันต้องการค้นหาเครื่องหมายจุดคู่สุดท้าย (:) และลบทุกอย่างก่อนหน้าและรวมไว้ด้วย

คำตอบ:


40

สมมติว่าคุณหมายถึงอะไรจริง ๆ คือคุณต้องการลบทุกอย่างจนถึงโคลอนสุดท้ายและjohn.doeคงสภาพเดิมเอาไว้:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

คำอธิบาย:

บรรทัดแรกเป็นเพียงท่อสตริงทดสอบเพื่อsedเป็นตัวอย่าง

ประการที่สองคือพื้นฐานเปลี่ยนตัวsed ส่วนที่หนึ่งและที่สอง/คือ regex เพื่อค้นหาและส่วนที่สองและสามคือสิ่งที่จะแทนที่ด้วย (ไม่มีอะไรในกรณีนี้ในขณะที่เรากำลังลบ)

สำหรับ regex .จับคู่อักขระใด ๆ*ทำซ้ำจำนวนเท่านี้ (รวมถึงศูนย์) และ:จับคู่โคลอน ดังนั้นจึงเป็นสิ่งที่มีประสิทธิภาพตามด้วยลำไส้ เนื่องจาก.*สามารถรวมเครื่องหมายโคลอนการแข่งขันคือ 'โลภ' และรวมทุกอย่างจนถึงโคลอนสุดท้าย


7
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}'

1
หากคุณกำลังจะใช้awkทำไมไม่ทำawk -F:?
แกรม

@Graeme awkฉันยังไม่ได้ว่าสะดวกสบายด้วย โดยพื้นฐานแล้วฉันพยายามทดสอบคำสั่งที่ฉันได้รับในตอนแรกและพยายามแก้ไขตามความต้องการของผู้ใช้ :)
Ramesh

3
-Fตัวเลือกสำหรับการawkระบุตัวคั่นสนาม หากคุณบอกawkให้ใช้โคลอนคุณไม่จำเป็นต้องแทนที่โคลอนด้วยแท็บ นอกจากนี้หากคุณต้องการได้รับเขตข้อมูลสุดท้ายที่คุณสามารถใช้$NFแทนได้$4สิ่งนี้จะใช้ได้ถ้าไม่มีโคลอน 3 ตัวเสมอ
แกรม

@ Graeme ฉันได้รวมการเปลี่ยนแปลงที่คุณพูดถึง โปรดแจ้งให้เราทราบหากนี่เป็นสิ่งที่ดี :)
Ramesh

ใช่ทำงานได้อย่างสมบูรณ์!
แกรม


2

โปรดลอง

แก้ไข: ลบสมอแล้ว

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

และเพื่อลบ

echo 'abc:fjk' |sed 's/.*://g'

นั่นไม่ใช่สิ่งที่ OP ขอ
iruvar

โปรดอ่านคำถามอีกครั้ง
akash

ดีที่คุณแอบลบหลังจากความคิดเห็นของฉันไม่เป็นไร
iruvar

อ้อเข้าใจแล้ว . คำขอโทษของฉัน 1_CR
akash

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