2013-08-04 18 views
5

Chciałbym połączyć kilka linii, wykonać na nich dopasowanie i wydrukować je. Próbowałem to zrobić z sed.Regex z sed, przeszukiwanie wielu linii

Mianowicie użyłem:

cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p' 

Drukuje tylko wiersze, które odpowiadają SOME_REGEX natomiast spodziewam się, że do łączenia przewodów z zakresu między pierwsza_linia i LAST_LINE i wydrukować konkatenacji jeśli pasuje SOME_REGEX.

Odpowiedz

9

Podczas korzystania z linii '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/' każda linia jest nadal przetwarzana osobno, aby połączyć linie, należy użyć przestrzeni do przechowywania lub polecenia N, aby dołączyć kolejną linię do obszaru wzorów. Oto jedna opcja:

cat add | sed -rn '/FIRST_LINE_REGEX/{:a;N;/LAST_LINE_REGEX/{/SOME_REGEX/p;d};ba}' 

wersja skomentowane:

cat add | sed -rn '/FIRST_LINE_REGEX/ { # if line matches /FIRST_LINE_REGEX/ 
    :a          # create label a 
    N          # read next line into pattern space 
    /LAST_LINE_REGEX/ {      # if line matches /LAST_LINE_REGEX/ 
    /SOME_REGEX/p       # print if line matches /SOME_REGEX/ 
    d          # return to start 
    } 
    ba          # return to label a 
}' 
+0

Dokładnie tego chciałem, dzięki. –

0

sed -n '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/p' add | sed -n '/FIRST_LINE_REGEX/ b check; H; $ b check; b; :check; x; /SOME_REGEX/p'

Motywacja drugiej części rurowej pochodzi stąd: https://stackoverflow.com/a/6287105/992834

EDIT: zmieniony, gdy SOME_REGEX jest pomiędzy.

+0

To nadal będzie tylko drukować linie zawierające 'SOME_REGEX', myślę, że OP chce wydrukować całe bloki, które zaczynają się od' FIRST_LINE_REGEX', kończą się na 'LAST_LINE_REGEX' i zawierają' SOME_REGEX'. –

+0

Problem polega na tym, że pierwsza sekcja przekazuje linie jako linie i są one nadal przetwarzane osobno. Chciałbym, aby druga sekcja wyświetlała całą zawartość między FIRST_LINE i SECOND_LINE, jeśli treść pasuje do SOME_REGEX –

+0

Podkreślenie "jeśli pasuje do SOME_REGEX". należycie odnotowano –