Perl per corrispondenza con le espressioni regolari in Terminal?

Sto cercando di familiarizzarmi con un po 'con Perl da utilizzare per ricerche di espressioni regolari in Terminal (Mac). Ora, non voglio imparare perfettamente Perl, solo cercando di capire come fare alcune semplici espressioni regolari.

Ma non riesco a capire come farlo in Terminal:

Vorrei essere in grado di abbinare le espressioni su più righe, e prenderò i tag HTML come esempio. NOTA BENE, che il tag HTML è solo un esempio di qualcosa da corrispondere, e in particolare qualcosa che va su più righe. Se l'HTML corrispondente con espressioni regolari sia una buona idea o no, non è il problema. Voglio solo capire la syntax di corrispondenza con Perl sulla linea di command!

Dico che voglio abbinare l'integer tag ul qui:

<ul> <li>item 1</li> <li>item 2</li> </ul> 

Mi piacerebbe:

  1. Puoi abbinare questo in un file e submit la partita allo stdout (non chiedere perché, vorrei solo capire come funziona :-))
  2. Essere in grado di sostituirlo con qualcos'altro.

Per la corrispondenza, ho trovato qualcosa di simile (usando "start" e "end" come esempio qui da un semplice file di text quando stavo testando, ma vi prego di dare l'esempio per il tag ul :

 perl -wnE 'say $1 if /(start(.*?)end)/' test.txt 

Questo corrisponde a una parte, ma solo in una row. Sorprendentemente, aggiungendo i s alla fine non ha funzionato per renderlo "dotall" o "modalità a linea singola", è ancora solo una linea corrispondente …

Per sostituire, ho provato qualcosa di simile:

 perl -pe 's/start(.*?)end/replacement text/'s test.txt 

Questo non funzionava né …

Beh, ecco una pagina wikipedia per abbinare o sostituire con Perl una linea . Ho fatto questo in Cygwin :

Perl può comportrsi come grep o come sed.

I /s fa corrispondere la nuova linea.

L'- -0777 fa applicare l'espressione regolare all'intera cosa invece che per row per row.

\n può corrispondere anche a una nuova linea.

 $ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//s' d [email protected] ~ $ echo -e 'a\nb\nc\nd' | perl -pe 's/.*c//s' a b d 

Ecco l'altra forma, -ne con print $1 :

 [email protected] ~ $ echo -e 'a\nb\nc\nd' | perl -ne 'print $1 if /(.*c)/s' c [email protected] ~ $ echo -e 'a\nb\nc\nd' | perl -0777 -ne 'print $1 if /(.*c)/s' a b c [email protected] ~ $ 

Alcuni altri esempi

 $ cat tt <ul> <li>item 1</li> <li>item 2</li> </ul> $ perl -0777 -ne 'print $1 if /\<ul\>(.*?)\<\/ul>/s' tt <li>item 1</li> <li>item 2</li> [email protected] ~ $ perl -0777 -ne 'print $1 if /(.*)/s' tt <ul> <li>item 1</li> <li>item 2</li> </ul> [email protected] ~ $ 

Un esempio di Global per il -ne uno (cambia "se" a "while"):

 $ echo -e 'bbb' | perl -0777 -ne 'print $1 while /(b)/sg' bbb 

Per il -pe , basta aggiungere il g alla fine ( /sg o /gs , la stessa cosa):

 $ echo -e 'aaa' | perl -0777 -pe 's/a/z/s' zaa [email protected] ~ $ echo -e 'aaa' | perl -0777 -pe 's/a/z/sg' zzz 

Nota: questa domanda contrasta / s e -0777