11
votes

Extrait du texte d'une chaîne multiligne à l'aide de Perl

J'ai une chaîne qui couvre plusieurs lignes. J'ai besoin d'extraire le texte entre deux cordes. Par exemple: xxx

J'ai besoin d'extraire la chaîne, Démarrer ici un exemple de texte couvrant quelques lignes.

Comment puis-je aller Ceci?


0 commentaires

3 Réponses :


30
votes

4 commentaires

Vous utilisez également le match gourmand, donc si quelqu'un a quelque chose qui dit ... "Démarrer Blah Blah End Blah Blah Start Blah Blah end", il capturera les deux séquences de démarrage / fin. Si vous utilisez . *? au lieu de cela, vous vous limiterez à un match à la fois.


Ne fonctionne pas pour moi: echo -e "test1 \ ntest2"> test && perl -ne 'imprimer $ _ si /test1.*test2/s' test n'empête rien.


@ Hi-ange qui est une question connexe différente sur l'utilisation du drapeau -N , qui est principalement répondu à ligne de commande Perl Multi -line remplace --- (Cependant, si ce n'est pas le cas, il convient de poser une nouvelle question)


@ user202729 Merci d'avoir effacé la confusion, je viens de l'essayer, travaille pour moi. Ensuite: il semble que Perl "traite tout le texte en tant que ligne unique" a une utilité limitée, car elle correspond à tout le texte ou une seule correspondance d'un groupe. Par exemple: écho -e "test1 \ ntest2 \ ntest3 \ ntest2 \ ntest2"> test && perl -0777 -ne 'print 1 $ IF / (test1 \ ntest2) /' Test donne "Test1 \ Ntest2 "Sortie juste une fois. Utilisation de ^ et $ n'est pas possible. Je verrai si je trouve le temps de signaler une demande de fonctionnalité pour un support multiligne approprié, comme les expulsions d'Emacs.



13
votes
print $1 if /(Start Here.*?)End Here/s;

0 commentaires

1
votes

ne serait-il pas le modificateur correct pour traiter la chaîne comme une seule ligne soit (? S) plutôt que (/ s)? Je luttais avec un problème similaire depuis un moment et que le testeur REGEXP incorporé dans les résultats de la vue de Jmètre Afficher les résultats de l'arborescence montre mon extracteur d'expression régulier avec le regex xxx

correspondant < Pré> xxx

pendant que la regex xxx

ne correspond pas. D'autres testeurs de regex montrent le même résultat. Cependant, lorsque j'essaie d'exécuter un script, j'obtiens l'erreur d'assertion BeanShell:

Message de défaillance d'affirmation: org.apache.jorphane.util.jmetrexception: Erreur lors de l'appel de la méthode BSH: Eval Source Fichier: Évaluation en ligne de: `Import Import Java.io. *; // Ecrivez les résultats des données à une tenue de fichier = "/ users / dani... '' '' '' '' '' '' Erreur d'analyse de jeton: Erreur lexicale à la ligne 12, Colonne 380. Rencontré:" \ n "(10),

Alors quelque chose d'autre est définitivement tort avec le mien. Quoi qu'il en soit, juste une suggestion


0 commentaires