grep ตัวละครโดยรอบของการแข่งขัน


8

ฉันต้องการค้นหาและแทนที่ภายในฐานข้อมูลขนาดใหญ่และมันไม่ได้ทำในสิ่งที่ฉันคิดว่าควรจะเกิดขึ้น ฉันต้องการ grep สำหรับสตริงเป้าหมายของฉันในไฟล์แล้วดูอักขระ 8 ตัวหรือมากกว่านั้น (ฉันอาจต้องปรับตัวเลขนั้นขึ้นอยู่กับ) ฉันจะทำสิ่งนั้นได้อย่างไร

เหตุผลที่ฉันไม่สามารถดูลูกตานี้ได้เพราะมีหลายร้อยถ้าไม่ตรงกัน ฉันต้องการได้รับจำนวนอักขระรอบ ๆ สตริงและจากนั้นสอดเข้าไปuniqหรือเพื่อดูว่าทำไมการค้นหาและแทนที่ของฉันจึงมีพฤติกรรมที่ไม่คาดคิด

นอกจากนี้ยังสามารถมีการแข่งขันหลายรายการในบรรทัดเดียวกัน!


มันไม่ใช่ไฟล์ข้อความใช่ไหม
enzotib

มันเป็น แต่แม้กระทั่งการแข่งขันจะมีขนาดใหญ่เกินไปไฟล์ที่จะลูกตา
user394

คำตอบ:


12

วิธีการใช้อย่างหยาบgrepจะเป็นเช่นนั้น

grep -o "....yourtext...." /path/to/the/dump.sql

จำนวนจุดสอดคล้องกับจำนวนตัวอักษรก่อน / หลังข้อความ grepped -oตัวเลือกที่จะทำให้grepการส่งออกเพียงการแข่งขันที่ไม่สายทั้งหมด

เพื่อใช้uniqกับเอาต์พุตจำไว้ว่าคุณต้องเรียงลำดับเอาต์พุตก่อน โดยทั่วไปแล้วคุณต้องทำ

grep . . . | sort | uniq

หากคุณมีความสนใจใน hitcount สำหรับการแข่งขันแต่ละครั้งคุณจะได้ผลลัพธ์ที่ดีโดยใช้

grep . . . | sort | uniq -c | sort -n

น้ำมันดิบ? มีความซับซ้อนที่สุด!
user394

1
คุณสามารถขยายเล็ก ๆ น้อย ๆ grep -o '.\{8\}yourtext.\{8\}'นี้โดยใช้ประกอบการทำซ้ำ: นี่เป็นอาการวิงเวียนศีรษะน้อยกว่าการนับ 8 จุดเล็กน้อย
คาเลบ

:) โดยหยาบฉันหมายความว่าคุณไม่ได้เล่นกับสิ่งต่าง ๆ เช่นการนับตัวละครที่จับคู่ (ใช้ช่วง) หรือการ จำกัด ชุดตัวละครให้แคบลง
rozcietrzewiacz

@Caleb และ user394: นี่คือสิ่งที่ฉันตั้งใจจะไม่แนะนำ (และเรียกว่าวิธีการของฉัน "หยาบคาย") เราไม่จำเป็นต้องจำโครงสร้างตัวดำเนินการซ้ำนอกจากนี้ - มันยิ่งเร็วกว่าในการพิมพ์ "..... " กว่า "\ \ 6 6}"
rozcietrzewiacz

7

เริ่มจากคำตอบของ @rozcietrzewiacz ฉันสามารถขยายเป็น

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file

1
ลำดับจุด "หยาบคาย" นั้นดูดีขึ้นเรื่อย ๆ ตลอดเวลา :)
Caleb

1
@Caleb: โดยทั่วไปคำตอบ "หยาบคาย" เป็นการเริ่มต้นที่ดี แต่บางครั้งเราต้องการที่จะอธิบายรายละเอียดเล็กน้อย
enzotib

1
วิธีการลำดับจุดจะไม่พบรูปแบบเป้าหมายที่ถูกต้องทางซ้ายหรือขวา วิธีนี้จะ (+1)
Peter.O

2
ป.ล. ฉันเพิ่งสังเกตเห็นว่ามันจะไม่จับอินสแตนซ์ของรูปแบบหลายรายการในบรรทัดเดียวกัน (ตามที่ระบุใน OP) เมื่อขอบเขตของข้อความ 'exta' ต่อท้ายของรูปแบบแรกซ้อนทับขอบเขตของข้อความ 'พิเศษ' นำหน้า ของรูปแบบต่อไป
Peter.O

@fred: ใช่-oให้เฉพาะนัดแรกเมื่อการแข่งขันสองรายการซ้อนทับกัน:echo 'aaabbbccc' | grep -o 'bb
enzotib
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.