จะให้รูปแบบสำหรับบรรทัดใหม่ใน grep ได้อย่างไร? บรรทัดใหม่ที่จุดเริ่มต้นบรรทัดใหม่ในตอนท้าย ไม่ใช่วิธีการแสดงออกปกติ บางอย่างเช่น \ n.
$. ค่อนข้าง จำกัด แต่ใช้ได้ในกรณีง่ายๆ
จะให้รูปแบบสำหรับบรรทัดใหม่ใน grep ได้อย่างไร? บรรทัดใหม่ที่จุดเริ่มต้นบรรทัดใหม่ในตอนท้าย ไม่ใช่วิธีการแสดงออกปกติ บางอย่างเช่น \ n.
$. ค่อนข้าง จำกัด แต่ใช้ได้ในกรณีง่ายๆ
คำตอบ:
grep รูปแบบจะจับคู่กับแต่ละบรรทัดดังนั้นจึงไม่มีวิธีที่รูปแบบจะตรงกับบรรทัดใหม่ที่พบในอินพุต
อย่างไรก็ตามคุณจะพบบรรทัดว่างเช่นนี้:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
ลองpcregrepแทนปกติgrep:
pcregrep -M "pattern1.*\n.*pattern2" filename
ตัวเลือกที่ช่วยให้มันตรงข้ามหลายบรรทัดเพื่อให้คุณสามารถค้นหาบรรทัดใหม่เป็น-M\n
คุณสามารถใช้วิธีนี้ ...
grep -P '^\s$' file
-Pใช้สำหรับนิพจน์ทั่วไป Perl (ส่วนขยายของ POSIX grep)\sจับคู่อักขระช่องว่างสีขาว ถ้าตามด้วย*จะตรงกับบรรทัดว่างด้วย^ตรงกับจุดเริ่มต้นของบรรทัด $ตรงกับจุดสิ้นสุดของบรรทัด -Pเป็นส่วนขยาย GNU ฉันสบายดีที่จะใช้มันเมื่อสถานการณ์เรียกร้อง (โดยทั่วไปจะเป็น lookahead / lookbehind) แต่ POSIX grep สามารถทำสิ่งนี้ได้ด้วยไฟล์[[:space:]].
-P. GNU ค่อนข้างเป็นมาตรฐานอยู่แล้ว :)
brew install grepได้ GNU grep ซึ่งดีกว่าในหลาย ๆ ด้าน apple.stackexchange.com/questions/193288/…
ขอขอบคุณที่ @jarno ฉันรู้เกี่ยวกับตัวเลือก -z และฉันพบว่าเมื่อใช้ GNU grep กับตัวเลือก -P ที่จับคู่กับ\nความเป็นไปได้ :)
ตัวอย่าง:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
พิมพ์ bar
สำหรับวิธีแก้ปัญหาชั่วคราว (โดยไม่ใช้แบบพกพา-P) คุณสามารถแทนที่อักขระขึ้นบรรทัดใหม่ชั่วคราวด้วยอักขระอื่นและเปลี่ยนกลับเช่น:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
โดยทั่วไปแล้วจะมองหาการจับคู่แบบตรงทั้งหมด_foo_โดยที่_mean \n(so __= \n\n) คุณไม่จำเป็นต้องแปลกลับโดยtr '_' '\n'แต่ละรูปแบบจะถูกพิมพ์ในบรรทัดใหม่ดังนั้นการลบ_ก็เพียงพอแล้ว
<(p paste -sd_ file )?
new line at the beginningเป็นบรรทัดว่างและnew line at endใช้กับทุกบรรทัดในไฟล์ คุณสามารถโพสต์ตัวอย่าง?