2013-08-04 20 views
5

Mi piacerebbe concatenare alcune righe, eseguire una corrispondenza regolare su di esse e stamparle. Ho provato a farlo con sed.Regex con sed, ricerca su più righe

Vale a dire, che ho usato:

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

esso stampa solo le linee che corrispondono SOME_REGEX mentre mi aspetto di concatenare le linee dal range tra FIRST_LINE e last_line e stampare la concatenazione se corrisponde SOME_REGEX.

risposta

9

Quando si utilizza '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/', ogni riga viene ancora elaborata separatamente, per concatenare le linee è necessario utilizzare lo spazio di blocco o il comando N per aggiungere la riga successiva allo spazio del motivo. Qui è una sola opzione:

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

versione commentato:

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

Questo è esattamente quello che volevo, grazie. –

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'

La motivazione della seconda parte del tubo viene da qui: https://stackoverflow.com/a/6287105/992834

Edit: modificata quando SOME_REGEX è nel mezzo.

+0

Questo stamperebbe solo le righe che contengono 'SOME_REGEX', penso che l'OP voglia stampare gli interi blocchi che iniziano con' FIRST_LINE_REGEX', terminano con 'LAST_LINE_REGEX', e contengono' SOME_REGEX'. –

+0

Il problema è che la prima sezione passa le linee come linee e vengono ancora elaborate separatamente. Mi piacerebbe che la seconda sezione stampasse tutto il contenuto tra FIRST_LINE e SECOND_LINE se il contenuto corrisponde a SOME_REGEX –

+0

Enfasi su "se corrisponde a SOME_REGEX". debitamente notato –