กรณีเฉพาะของ grep ที่ไม่โลภ


1

ฉันรู้ว่ามีตัวอย่างมากมายของ regex ที่ไม่โลภด้วย grep แต่ฉันมีปัญหากับกรณีเฉพาะของฉัน

ไฟล์ของฉันมีเส้นคล้ายกับ:

[X12345.Yabc.Z7989].[ALPHA/BRAVO].[CHARLIE.DELTA]

และฉันพยายามที่จะแยกออกเพียง X12345 ส่วนหนึ่ง
นั่นคือส่วนที่เริ่มต้นด้วย X และจนถึงช่วงแรก ( . )

ตัวอย่างที่ใกล้เคียงที่สุดของฉันคือ:

grep -Eo "X(.*?)\."  inputfile

แต่นั่นก็โลภเกินไป (แม้ว่าฉันคิดว่าฉันใช้ .*? อย่างถูกต้อง

ใครช่วยแนะนำฉันไปยัง regex ที่เหมาะสม?


ทำไมต้อง grep ดูเหมือนว่างานสำหรับ cut -d '.' -f1 | cut -d '[' -f2, ถึงฉัน
Sirex

คำตอบ:


2

คุณกำลังใช้ .* อย่างถูกต้อง แต่อย่างที่คุณสังเกตเห็นมันเป็นโลภกินตัวละครมากที่สุดเท่าที่จะทำได้ในการแข่งขันของคุณเพราะ . ตรงกับตัวละครใด ๆ คุณสามารถทำได้:

grep -Eo "X([^.]*?)\." inputFile

ตรงกับ X ตามลำดับความยาวของจุดที่ไม่ใช่ ( [^.]* ) ถึงตัวละครบางตัว ( ? ) และจุด ( \. ) คุณบอกว่าคุณสนใจทุกอย่างระหว่าง X แรกและแรก แม้ว่าดังนั้นคุณสามารถลดความซับซ้อนนี้เพิ่มเติม:

grep -Eo "X[^.]*\." inputFile

นั่นทำให้รู้สึกบางอย่าง ถ้าฉันรู้ว่าสิ่งต่อไปนี้ X จะเป็นตัวเลขเท่านั้นนิพจน์นี้ใช้งานได้หรือไม่ "X [0-9] + \". (ฉันจะลองทั้งหมดเมื่อฉันไปที่สำนักงานในวันพรุ่งนี้)
abelenky

ใช่นั่นก็จะใช้ได้เช่นกัน โดยทั่วไปการจับคู่ของคุณจะ จำกัด มากขึ้น ฉันไม่ได้เห็น -o ใช้สวิตช์กับ grep ก่อน (เรียนรู้บางอย่างทุกวัน!) โดยปกติฉันจะใช้ sed เพื่ออะไรแบบนี้ ใน sed จะมีลักษณะเช่นนี้: sed -E 's/^.*(X[^.]*\.).*$/\1/' inputFile.
dsummersl

ขอบคุณ เหตุผลพิเศษใด ๆ สำหรับการตั้งค่าของ sed -E เกิน grep -Eo?
abelenky

นิสัยซื่อสัตย์ ที่กล่าวว่าคุณสามารถประสบความสำเร็จได้มากกว่าด้วย grep มันค้นหา / แทนที่บรรทัดเดียวเช่นเดียวกับหลายบรรทัดของการป้อนข้อมูลของคุณ สมมติว่าคุณต้องการกรองรูปแบบ 'foobar' ทั้งหมดในไฟล์แล้วแปลง foo ด้วย bar (barfoo) คุณสามารถทำสิ่งนั้นได้ด้วยความใจเย็น แต่ไม่ใช่ grep: sed -E 's/(foo)(bar)/\2\1/' inputFile
dsummersl

ดูเหมือนว่ามีความแตกต่างที่สำคัญในวิธีการทำงาน: sed ช่วยให้ทุกอย่างผ่านการประมวลผลเฉพาะสิ่งที่ตรงกัน grep บล็อกทุกอย่างยอมให้ผ่านสิ่งที่ตรงกันเท่านั้น
abelenky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.