ไฟล์ที่คุณแสดงมีรายละเอียดทั้งหมดในหนึ่งบรรทัด:
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 รายการเท่านั้น!)
.
อักขระใด ๆ จึง.*
แสดงถึงจำนวนอักขระใด ๆ
;
แยกคำสั่งเช่นเดียวกับในเปลือก