ไฟล์ที่คุณแสดงมีรายละเอียดทั้งหมดในหนึ่งบรรทัด:
name : farah age : 23 phone number : 0123 education : degree
ฉันคิดว่าคุณสามารถใส่ฮาร์โค้ดและage :อื่น ๆ ลงในคำสั่งได้ แต่ข้อความที่ตามมาจะแตกต่างกันไปและรายละเอียดอาจไม่อยู่ในลำดับที่กำหนดหรือติดกัน
คุณสามารถแยกชิ้นส่วนของเส้นที่มีgrep's -oธง สิ่งนี้จะพิมพ์เฉพาะส่วนที่จับคู่ไม่ใช่ทั้งเส้น
หากคุณต้องการรวมage :และphone number :ชิ้นส่วนคุณสามารถใช้การ-eตั้งค่าสถานะเพื่อระบุการแข่งขันหลายรายการหรือการสลับ
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
นิพจน์[^ ]*หมายถึงจำนวนอักขระที่ไม่ใช่ช่องว่างดังนั้นจึงจับคู่อักขระหลังจากage :ถึงช่องว่างถัดไป
แทนที่fileด้วยชื่อไฟล์ที่มีรายละเอียดของคุณ คุณสามารถเขียนไฟล์ใหม่โดยเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ใหม่ด้วย>โอเปอเรเตอร์ดังนี้:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
เมื่อคุณทำเช่นนั้นคุณจะไม่เห็นผลลัพธ์ใด ๆ คุณควรตรวจสอบผลลัพธ์ก่อนจากนั้นเพิ่มการเปลี่ยนเส้นทาง
นี่คือตัวอย่างของการสลับ เราใช้การ-Eตั้งค่าสถานะเพื่อบอกgrepให้ใช้การขยายเพิ่มเติม ไวยากรณ์(pattern1|pattern2)- แมตช์นี้และpattern1 / หรือ pattern2หากพบอย่างใดอย่างหนึ่งก็จะถูกพิมพ์ (ไม่ว่าจะพบคนอื่นหรือไม่) ตอนนี้ฉันกำลังใช้+ความหมายอย่างน้อยหนึ่งในตัวละครก่อนหน้าแทนที่จะเป็น*ความหมายศูนย์ของตัวละครก่อนหน้าหรือมากกว่านั้น ในบริบทนี้พวกเขาทำงานได้ดีอย่างเท่าเทียมกัน
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
หากคุณต้องการละเว้นage :และphone number:ส่วนต่าง ๆ คุณสามารถใช้การ-Pตั้งค่าสถานะเพื่อขอgrepให้ใช้นิพจน์ทั่วไปที่เข้ากันได้กับ Perl สิ่งนี้สนับสนุนการสลับและวิธีการจับคู่ข้อความหลังรูปแบบที่กำหนด:
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
หากคุณต้องการจัดรูปแบบข้อความแตกต่างกันคุณสามารถใช้sedตัวอย่างเช่น:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
ขึ้นอยู่กับว่าageจะมาก่อนphone numberดังนั้นโปรดปรับให้เหมาะสมหากไม่ใช่ในกรณีนี้ หากคุณไม่สามารถพึ่งพาคำสั่งซื้อคุณสามารถใช้คำสั่งที่ซับซ้อนมากนี้:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
นี่เป็นการจัดเรียงบรรทัดใหม่เพื่อให้phone number :ส่วนมาก่อนทุกบรรทัดจากนั้นทำการแทนที่ครั้งที่สองเพื่อเลือกรายละเอียดที่ต้องการ ฉันเป็นหนี้เทคนิคที่ใช้ที่นี่เพื่อคำตอบนี้โดย Muru
หมายเหตุเกี่ยวกับsedคำสั่งที่ไม่ครอบคลุมโดยคำอธิบายก่อนหน้า
-rใช้ Extended regex สำหรับคำสั่งที่อ่านได้มากขึ้น (GNU sedเข้าใจ-Eด้วยความหมายเดียวกัน)
s/old/new/แทนที่oldด้วยnew
(pattern)บันทึกpatternไปยังการอ้างอิงในภายหลังด้วย\1หรือ\2อื่น ๆ (สอดคล้องกับลำดับจากซ้ายไปขวาที่กลุ่มการดักจับเกิดขึ้น - โปรดทราบว่าsedจะเก็บได้ถึง 7 รายการเท่านั้น!)
.อักขระใด ๆ จึง.*แสดงถึงจำนวนอักขระใด ๆ
; แยกคำสั่งเช่นเดียวกับในเปลือก