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:
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 ~ $
$ 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