จะให้รูปแบบสำหรับบรรทัดใหม่ใน 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
ใช้กับทุกบรรทัดในไฟล์ คุณสามารถโพสต์ตัวอย่าง?