繁体   English   中英

如何从Perl字符串中提取文件路径?

[英]How can I extract a file path from a Perl string?

我想从此字符串中找到具有全路径的文件名

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

我要提取

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

我正在Perl中尝试

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

但我得到以下输出:

/ClReportsHandler.java:233:

它与最后一个/和最后一个匹配: 如何将其更改为first / first :

在这种情况下,“粘合和伸展”是有用的。 您知道[exec]后面是空格,右边是冒号,后面是行号。 您想要介于两者之间的内容:

#! /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";
}

如果文件名不包含空格,则可以创建简单的正则表达式以匹配所有部分:

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

我用过:

  • \\S+匹配1个或多个非空格符号
  • [^:]+匹配1个或更多not :符号

如果你想在道路空间,那么最好的办法是除去起始[exec]由部分和分裂:

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

您可以尝试:

#!/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;

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

如果要匹配,为什么要使用split()

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

应该这样做。

说明:

! :替代正则表达式定界符(因为我需要/内部)

( :开始捕获组

/ :匹配一个/ 这将始终是字符串的第一个/

[^:]+ :匹配1个或更多字符,但:

) :结束捕获组

: :匹配:

! :正则表达式分隔符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM