bir maçın çevresindeki karakterleri grep


8

Dev bir veritabanı dökümü içinde bir bulma ve değiştirme yapmak için arıyorum ve bu olması gerektiğini düşündüğüm yapmıyor. Dosyadaki hedef dizem için grep ve daha sonra çevreleyen 8 karakteri görmek istiyorum (bağlı olarak bu sayıyı ayarlamanız gerekebilir). Bunu nasıl yapabilirim?

Bunu göz küresi yapamamamın nedeni, yüzlerce maç olmasa da yüzlerce maç olması. Dizeyi çevreleyen bazı karakterleri almak ve sonra uniqbenim bul ve değiştir neden beklenmedik davranışlar olduğunu görmek için bir şey ya da bir şey boru istiyorum.

Ayrıca, aynı hatta birden fazla maç olabilir!


Bir metin dosyası değil mi?
enzotib

Öyle, ama sadece maçlar bile göz küresi için çok büyük bir dosya.
user394

Yanıtlar:


12

Ham yolu kullanarak grepgibi bir şey olurdu

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

Nokta sayısı, açılan metinden önceki / sonraki karakter sayısına karşılık gelir. Bu -oseçenek, grepçıktıyı sadece eşleşmeleri yapar , tüm satırları değil.

uniqÇıktıda kullanmak için önce çıktıyı sıralamanız gerektiğini unutmayın. Yani tipik olarak,

grep . . . | sort | uniq

Her maç için hitcount ile ilgileniyorsanız, kullanarak güzel bir çıkış elde edebilirsiniz

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

Ham? Tamamen sofistike!
user394

1
Sen tekrar operatörünü kullanarak bu biraz genişletebilirdik: grep -o '.\{8\}yourtext.\{8\}'. Bu, 8 nokta saymaktan biraz daha az baş döndürücü.
Caleb

:) Kaba demek istediğim, eşleşen karakterleri saymak (aralık kullanarak) veya karakter setlerini daraltmak gibi şeylerle oynamıyorsunuz.
rozcietrzewiacz

@Caleb ve user394: Bu tam olarak önermemeyi amaçladığım şeydi (ve bu yüzden yöntemime "ham" denir). Tekrarlanan operatör yapısını hatırlamak gerekmez, ayrıca - "." {"\" 6 \} "den daha hızlı yazılır.
rozcietrzewiacz

7

@Rozcietrzewiacz cevabından başlayarak,

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

1
"Ham" nokta dizisi her zaman daha iyi ve daha iyi görünüyor :)
Caleb

1
@Caleb: genellikle "kaba" cevap iyi bir başlangıçtır, ancak bazen üzerinde biraz durmak ister.
enzotib

1
Nokta sırası yöntemi sola veya sağa yaslanmış hedef kalıpları bulamaz; bu yöntem olacaktır. (+1)
Peter.O

2
Not: İlk desenin son 'exta' metninin kapsamı, önde gelen 'ekstra' metnin kapsamıyla çakıştığında, aynı satırda (OP'nin belirttiği gibi) birden çok desen örneğini yakalamayacağını fark ettim. desen
Peter.O

@fred: evet, -oiki maç çakıştığında sadece ilk maçı verir:echo 'aaabbbccc' | grep -o 'bb
enzotib
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.