Perl pour correspondre avec des expressions régulières dans Terminal?

J'essaie de me familiariser un peu avec Perl pour utiliser les recherches d' expressions régulières dans Terminal (Mac). Maintenant, je ne cherche pas vraiment à apprendre Perl de manière rigoureuse, en essayant simplement de savoir comment faire des expressions régulières simples.

Mais je ne peux pas comprendre comment faire cela dans Terminal:

J'aimerais pouvoir faire correspondre les expressions sur plusieurs lignes, et je prendrai les balises HTML comme exemple. VEUILLEZ NOTER que la balise HTML est juste un exemple de quelque chose à égaler, et plus précisément quelque chose qui dépasse plusieurs lignes. Si le fait de faire correspondre HTML avec une expression régulière est une bonne idée ou non, ce n'est pas le problème. Je veux simplement comprendre la syntaxe de la correspondance avec Perl sur la ligne de commande!

Disons que je veux faire correspondre l'ensemble de la balise ul ici:

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

J'aimerais:

  1. Peut être en mesure de faire correspondre cela dans un fichier et de produire la correspondance à la stdout (ne demandez pas pourquoi, je voudrais juste comprendre comment cela fonctionne :-))
  2. Être capable de le remplacer par quelque chose d'autre.

Pour l'appariement, j'ai trouvé quelque chose comme ceci (en utilisant 'start' et 'end' comme exemple ici à partir d'un simple fichier texte lorsque je testais, mais donne l'exemple de l'étiquette ul place:

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

Cela correspond à une partie, mais seulement d'une seule ligne. De façon surprenante, l'ajout des s à la fin n'a pas fonctionné pour le rendre «dotall» ou «mode ligne unique», il correspond toujours à une seule ligne …

Pour remplacer, j'ai essayé quelque chose comme ceci:

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

Cela ne fonctionnait pas non plus …

Eh bien, voici une page de wikipedia pour l'appariement ou le remplacement avec Perl One Liners . Je l'ai fait dans Cygwin :

Perl peut se comporter comme grep ou like sed.

Le /s fait que le point correspond à une nouvelle ligne.

Le -0777 fait appliquer l'expression régulière à l'ensemble au lieu d'une ligne par ligne.

\n peut également correspondre à la nouvelle ligne.

 $ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//s' d user@comp ~ $ echo -e 'a\nb\nc\nd' | perl -pe 's/.*c//s' a b d 

Voici l'autre formulaire, -ne avec print $1 :

 user@comp ~ $ echo -e 'a\nb\nc\nd' | perl -ne 'print $1 if /(.*c)/s' c user@comp ~ $ echo -e 'a\nb\nc\nd' | perl -0777 -ne 'print $1 if /(.*c)/s' a b c user@comp ~ $ 

Quelques exemples supplémentaires

 $ 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> user@comp ~ $ perl -0777 -ne 'print $1 if /(.*)/s' tt <ul> <li>item 1</li> <li>item 2</li> </ul> user@comp ~ $ 

Un exemple de Global pour -ne (changer "if" to "while"):

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

Pour le -pe , ajoutez simplement le g à la fin ( /sg ou /gs , la même chose):

 $ echo -e 'aaa' | perl -0777 -pe 's/a/z/s' zaa user@comp ~ $ echo -e 'aaa' | perl -0777 -pe 's/a/z/sg' zzz 

Remarque: cette question contraste / s et -0777