ฉันมีรอยขีดข่วนหัวของฉันเป็นเวลาหนึ่งชั่วโมงกับ perl oneliner ที่ล้มเหลวเนื่องจากไฟล์มีการสิ้นสุดบรรทัด CRLF มี regex พร้อมการจับคู่แบบกลุ่มที่ท้ายบรรทัด และ CR ถูกรวมไว้ในการแข่งขัน ทำให้เกิดสิ่งที่ไม่ดีด้วยการใช้การอ้างอิงด้านหลังเพื่อแทนที่
ฉันลงเอยด้วยการระบุ CRLF ด้วยตนเองใน regex แต่มีวิธีให้ Perl จัดการการสิ้นสุดบรรทัดโดยอัตโนมัติ ไม่ว่าจะเป็นอะไรก็ตาม
คำสั่งเดิมคือ
perl -pe 's/foo bar(.*)$/foo $1 bar/g' file.txt
คำสั่ง "ถูกต้อง" คือ
perl -pe 's/foo bar(.*)\r\n/foo $1 bar\r\n/g' file.txt
ฉันรู้ว่าฉันสามารถแปลงการสิ้นสุดบรรทัดก่อนการประมวลผลได้ ฉันสนใจที่จะให้ Perl จัดการกรณีนี้อย่างสง่างามได้อย่างไร
ไฟล์ตัวอย่าง (บันทึกด้วยการลงท้ายบรรทัด CRLF!)
[19:06:57.033] foo barmy
[19:06:57.033] foo baryour
ผลผลิตที่คาดหวัง
[19:06:57.033] foo my bar
[19:06:57.033] foo your bar
เอาต์พุตพร้อมคำสั่งดั้งเดิม (แถบไปที่จุดเริ่มต้นของบรรทัดเนื่องจากจับคู่พร้อมกับการขึ้นบรรทัดใหม่):
bar:06:57.033] foo my
bar:06:57.033] foo your
s
ตัวแก้ไข/gs
:) - person HamZa   schedule 30.10.2013\s*
ใช้งานไม่ได้ แต่ยังคงจับ CR ใน.*
- person CharlesB   schedule 30.10.2013/gs
modifier ไม่ทำงาน - person CharlesB   schedule 30.10.2013$
อย่างดุเดือด มันกำลังทำอะไรอยู่ที่นั่น? คุณช่วยยกตัวอย่างอินพุตและเอาต์พุตที่คาดหวังได้ไหม - person HamZa   schedule 30.10.2013$
อยู่ที่นี่เพื่อให้ตรงกับจุดสิ้นสุดของบรรทัด ฉันต้องการบันทึกทุกอย่างตั้งแต่bar
ถึงจุดสิ้นสุด แน่นอนว่าไม่จำเป็น แต่การลบออกจะไม่เปลี่ยนแปลงอะไรเลย - person CharlesB   schedule 30.10.2013m
modifier ล่ะ? สาธิต - person HamZa   schedule 30.10.2013