ฉันจะค้นหาสองวลีที่แตกต่างกันอย่างไรเมื่ออยู่บนสองบรรทัดที่แตกต่างกันโดยใช้grep
คำสั่งเดียว?
ตัวอย่างเช่น
บรรทัดที่ 1: นี่คือความหวาน
บรรทัดที่ 2: เลมอน
ฉันใช้สิ่งนี้ แต่ไม่มีผลลัพธ์
grep "sweet.*lemon" file_type
ฉันจะค้นหาสองวลีที่แตกต่างกันอย่างไรเมื่ออยู่บนสองบรรทัดที่แตกต่างกันโดยใช้grep
คำสั่งเดียว?
ตัวอย่างเช่น
บรรทัดที่ 1: นี่คือความหวาน
บรรทัดที่ 2: เลมอน
ฉันใช้สิ่งนี้ แต่ไม่มีผลลัพธ์
grep "sweet.*lemon" file_type
คำตอบ:
หากต้องการใช้grep
สองบรรทัดที่แตกต่างกันให้ค้นหาทั้งสองรูปแบบ
$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
หรือใช้สลับกัน
$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
ในการรับบรรทัดถัดไปหลังจากรูปแบบคุณสามารถใช้ตัวเลือกบริบท
$ grep -A1 sweet file_type
This is a sweet
lemon.
แต่ถ้าคุณกำลังค้นหาอย่างชัดเจนสำหรับรูปแบบหลาย, นั่นเป็นเพราะหากินgrep
คิดในสาย ... คุณ.*
จะจับทุกอย่างระหว่าง "หวาน" และ "มะนาว" ในบรรทัด เราสามารถรับ "lemon" ในบรรทัดถัดไป-P
โดยใช้\n
เพื่อให้ตรงกับ newline และโดยบอกว่าgrep
ไฟล์นั้นถูกคั่นด้วย-z
:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-E
ใช้นิพจน์ทั่วไปแบบขยาย (เพื่อใช้|
อักขระสำหรับการสลับโดยไม่จำเป็นต้องหลบหนี)-An
พิมพ์บรรทัดเพิ่มเติมหลังจากรูปแบบโดยที่ n คือจำนวนของบรรทัดต่อท้ายที่จะพิมพ์-P
ใช้การแสดงออกปกติของ Perl สไตล์ ("ทดลอง" ในgrep
- ติดตั้งpcregrep
แทนเพื่อการสนับสนุนที่ดีกว่า perl regex)-z
ใช้อักขระ null เป็นตัวคั่น (ทำท่าในกรณีนี้ แต่grep
ใช้คำพูดของเรา)-o
พิมพ์เฉพาะส่วนที่จับคู่-o
... แก้ไข ...
grep: The -P and -z options cannot be combined
- เช่น grep (GNU grep) 2.5.1 บน RHEL
แบบนี้:
grep "sweet\|lemon"
grep
โดยผลงานที่เริ่มต้นในโหมด "มาตรฐาน" ที่ "ตัวอักษรพิเศษ" ชอบ|
, +
, *
มีการตีความตามตัวอักษรเว้นแต่พวกเขากำลังสวมหน้ากากด้วยเครื่องหมายทับขวา ดูตัวอย่างคำตอบนี้ ในการใช้วิธีที่คุณอาจคุ้นเคยกับการที่ต้องสวมหน้ากาก "อักขระพิเศษ" เพื่อตีความอย่างแท้จริงคุณต้องเปลี่ยนไปใช้ "โหมดขยาย" ( grep -E
) บางที madneon สามารถอธิบายเพิ่มเติมเกี่ยวกับคำตอบของเขาได้อีกเล็กน้อยตัวอย่างเช่น OP ที่ลองใช้จะจับคู่กันอย่างไร
grep -zP
คำสั่งจะทำงานในกรณีเฉพาะนี้ (ไฟล์ที่ประกอบด้วยสองบรรทัด) โดยทั่วไปแล้วจะพิจารณาไฟล์ที่คั่นด้วย newline สามัญใด ๆ ที่จะเป็นบรรทัดเดียวดังนั้นการถ่ายโอนเนื้อหาไฟล์ทั้งหมด (ถ้ามีการแข่งขันที่ไหนสักแห่ง) หรือไม่มีอะไร มักที่ไม่ได้เป็นสิ่งที่ผู้คนใช้grep
สำหรับ