Birbirini izleyen iki satırın içeriğine göre nasıl bir dizin oluşturabilirim?


11

"Foo" içeren satırlar için nasıl dizin oluşturabilirim, ancak yalnızca bir sonraki satır "Bar" ı içerdiğinde eşleşmeleri nasıl alabilirim?


Sorun şimdi orijinalinden tamamen farklı: / Belki eski sürümleri geri döndürmek ve bir tane daha POST? Üstelik yeni soru benim için net değil.
Gilles Quenot

@sputnick - nasıl yani? Soruyu ilk gönderdiğimde bir dizin belirledim; Sadece cesaretini verdim çünkü insanlar fark etmiyorlardı.
Nathan Long

Boşver, işe yarayacak, POST'umu buna göre düzenleyeceğim.
Gilles Quenot

Yanıtlar:


7

@ warl0ck bana doğru yönde işaret etti pcregrep, ama dedim "içerir", "değil" ve bir dizin değil, bir dosya hakkında sordum.

Bu benim için işe yarıyor gibi görünüyor.

pcregrep -rMi 'Foo(.*)\n(.*)Bar' .

6

Grep'in kendisi desteklemiyor gibi görünüyor, bunun yerine pcregrep kullanın:

Foo
Bar
Foo
abc

pcregrep -M "Foo\nBar" file

Var:

Foo
Bar

3
OP bunu söylemedi Foove Bartüm çizgiyi içerecekti.
tojrobinson

6

Bir sedsenaryo ile:

#!/bin/sed -nf

/^Foo/{
    h         # put the matching line in the hold buffer
    n         # going to nextline
    /^Bar/{   # matching pattern in newline
        H     # add the line to the hold buffer
        x     # return the entire paragraph into the pattern space
        p     # print the pattern space
        q     # quit the script now
    }
}

Kullanmak için:

chmod +x script.sed
printf '%s\n' * | ./script.sed

printfBurada bir satırda her biri üzerinde geçerli dizindeki tüm dosyaları görüntülemek ve onu geçmek sed.

Not : bu alfabetik sıraya göre sıralanmıştır.

Yararlı pattern spaceve hold space BURAYA daha fazla bilgi .

grymoire.comshell programlama hakkında gerçekten iyi şeyler var .


Ne anlama h, n, H, x, p, qgeliyor? Çok ilginç.
Yamaneko

Yorumlarıma bakın. pattern space& hold space: Grymoire.com/Unix/Sed.html#uh-56 veya Fransızca yorumda
Gilles Quenot

POST bir dizinde çalışmak için uyarlanmıştır
Gilles Quenot

4

grepYalnızca kullanarak , aşağıdaki boruyu oluşturabilirsiniz:

grep -A1 'Foo' input_file | grep -B1 'Bar' | grep 'Foo'

Birincisi grep, içerdiği tüm çizgileri Foove maçtan sonraki çizgiyi alacak. Sonra Barmaçtan önce olduğu kadar satır içeren satırlar alırız ve son olarak bu çıktıdaki satırları çıkarırız Foo.

DÜZENLEME: As manatwork işaret, gözleme konusunda bazı sorunlu durumlar vardır. Her ne kadar ilginç bir zorluk olsa da, grep'line odaklı işlevsellik nedeniyle , bununla ilgili herhangi bir çözümün bir' hack 'olması muhtemeldir ve muhtemelen pcregrepeldeki göreve daha uygun bir şey kullanmaktan daha iyidir .


Güzel. Ama bir dizin hakkında sordum; Bu işe yarıyor gibi:find . -name '*.txt' | xargs grep -A1 'Foo' | grep -B1 'Bar'
Nathan Long

Bu aynı zamanda hem “Foo” hem de “Bar” ile meydana gelen olayları listeler.
manatwork

@manatwork: "Foo" ve "Bar" içeren satırlar, istenen "Foo" içeren satırlardır.
tojrobinson

1
@tojrobinson, “ama sadece bir sonraki satırda“ Bar ”” kısmı olduğunda eşleşme olsun? pastebin.com/Yj8aeCEA
manatwork

3

Nathan'ın çözümünü kullanmayı tercih ederken pcregrep, burada sadece grep kullanan çözüm

grep -o -z -P  'Foo(.*)\n(.*)Bar' file

Seçenekler açıklaması:

  • -oyalnızca eşleşen kısmı yazdırın. Eklenmesi -ztüm dosyanın çıktısını alacaktır (bir yerde \ 0 olmadığı sürece)
  • -z Girdiyi, her biri yeni satır yerine sıfır bayt (ASCII NUL karakteri) ile sonlandırılmış bir dizi satır olarak kabul edin.
  • -P perl normal ifade sözdizimi

EDIT: Bu sürüm eşleşen tüm satırları yazdırır

    grep -o -P -z  '(.*)Foo(.*)\n(.*)Bar(.*)' file

1
Serin numara ne -z. Tüm ifadeden önce ve sonra bazı “(. *)”, Eşleşen tüm satırların çıktısını almasını sağlar. Şimdilik “Foo” öncesi ve “Bar” sonrası alt dizeler görüntülenmiyor.
manatwork

1

Awk ile:

awk '/bar/ && prev != "" {print FILENAME ": " prev "\n" FILENAME ": " $0}
     /foo/ {prev=$0; next}
     {prev=""}' file1...

(awk sınırlaması hakkında genel not: bazı dosya adları "=" karakter içeriyorsa, awk ./filenameyerine bunları filenameiletmeniz gerektiğini unutmayın)

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.