2010-09-21 4 views
1

Je veux trouver le nom du fichier avec fullpath de cette chaîneComment puis-je extraire un chemin de fichier à partir d'une chaîne Perl?

"[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol" 

Je veux extraire

/snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java 

et je suis en train ce en Perl

 
    $_=$string_from_to_match 
    my @extract_file=split(/.*(\/.*)\:.*/); 
    print $extract_file[1],"\n";` 

mais je reçois cette sortie:

/ClReportsHandler.java:233: 

Il correspond à la dernière / et la dernière :. Comment puis-je le changer en premier / et en premier :?

+3

Veuillez modifier la version formatée au lieu de revenir à la version non formatée. Sinon, votre question est illisible. –

Répondre

0

Pourquoi utilisez-vous split() si vous voulez faire correspondre?

if ($subject =~ m!(/[^:]+):!) { 
    $result = $1; 
} else { 
    $result = ""; 
} 

devrait le faire.

Explication:

!: delimiter regex alternatif (puisque je besoin de l'/ intérieur)

(: commencer la capture groupe

/: correspondre à un /. Ce sera toujours le premier / de la chaîne.

[^:]+: Match 1 ou plusieurs caractères, sauf :

): capture fin groupe

:: correspondent à une :

!: delimiter regex

+0

Un commentaire du downvoter? –

1

Si votre nom de fichier ne contenir des espaces alors vous pouvez créer simple regexp pour correspondre à toutes les parties:

my ($file, $line, $msg) = ($string_from_to_match =~ m{(\S+):([^:]+):([^:]+)}); 

Je l'ai utilisé:

  • \S+ pour correspondre à 1 ou plusieurs symboles non-espace
  • [^:]+ pour correspondre à 1 ou plusieurs non : symboles

Si vous voulez espaces chemin, alors le meilleur moyen est de supprimer [exec] partie et de diviser par ::

$string_from_to_match =~ s{^\[exec\]\s+}{}; 
my ($file, $line, $msg) = split(/:/, $string_from_to_match, 3); 
4

Ceci est un cas où "tacking et étirement" est utile. Vous savez que [exec] suivi par des espaces est sur la gauche et le côlon suivi d'un numéro de ligne est sur la droite.Vous voulez ce qui est en entre:

#! /usr/bin/perl 

use warnings; 
use strict; 

$_ = "[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol"; 

if (/\[exec\]\s*(.+?):\d+/) { 
    print $1, "\n"; 
} 
+0

Salut, il a travaillé et à partir de votre expression régulière, j'ai changé le mien comme ça et ça fonctionne bien .. mon

@extract_file=split(/.*?(\/.*?)\:.*/);

1

Vous pouvez essayer:

#!/usr/bin/perl 
use strict; 
use warnings; 
use 5.10.1; 

my $str = "[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol"; 
$str =~ s!^[^/]*(/[^:]*):.*$!$1!; 
say $str; 

Ouput: /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/Amdocs/iamcust/BIL/cl/business/handlers/ClReportsHandler.java

Questions connexes