【问题标题】:Extract the id from long file path ( regex) perl从长文件路径(正则表达式)perl中提取id
【发布时间】:2016-09-19 20:35:28
【问题描述】:

我正在尝试从我在 perl 脚本中读取的文件路径中提取一个 id(例如 11894373690) -

/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ 

我将进一步使用它创建一个新路径,如

/my/local/projects/Samplename/analysis/test/output/tool2/11894373690_NEW/

我无法仅从路径中提取 id,任何人都可以在 perl 中提出一个简单的方法。我绝对应该开始学习正则表达式! 谢谢。 我只能得到最后一个目录名

$file = "/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ ";

my ($id) = $file =~ /\.(A1[^]+)/i;

更新 - 对不起,我之前把“not”拼错了“now”!我无法提取 id。谢谢!

【问题讨论】:

  • 你尝试了什么?你是怎么提取身份证的?用正则表达式?没有它?
  • 取决于你的身份证。都是数字吗?总是后跟下划线?
  • 您可以尝试使用在线正则表达式解析器来构建它regexplanet.com/advanced/perl/index.html
  • 如果你想在 bash 中使用 sed,... echo "/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ " | sed -e 's|^.*/([0-9][0-9]*)_cast/.*$|\1|'
  • @yonyon100 我无法获得 id,抱歉,我在前面的问题中拼错了“not”,这改变了问题!

标签: regex perl filepath


【解决方案1】:

简单的正则表达式或拆分都可以,但有多个核心包可用于处理路径。

这使用File::Spec 分割路径,然后加入新路径。请注意,没有转义之类的,没有/ 计数——实际上甚至不需要提及分隔符。

use warnings 'all';
use strict;

use File::Spec::Functions qw(splitdir catdir);

my $path_orig = '...';

my @path = splitdir $path_orig;

my ($mark, $dir);
foreach my $i (0..$#path) 
{ 
    if ($path[$i] =~ m/(\d+)_cast/) 
    {
        $dir = $1;
        $mark = $i;
        last;
    }
}

my $path_new = catdir @path[0..$mark-1], $dir . '_NEW';

当然,您可以通过其他方式操作@path 数组——从它的背面剥离组件 (pop @path while $path[-1] !~ /.../),或者迭代并复制到一个新数组中,等等。

上面的代码很简单,不需要额外的数据复制,也不需要多个正则表达式匹配。


显然新旧路径有区别(tool1 vs tool2),请调整。重点是一旦路径被分割,通过数组就很简单了。

至于一个简单的正则表达式来获取 id

my ($id) = $path =~ m{/(\d+)_cast/};

如果\d+_cast确定明确的(只有一个名称中包含该名称的目录),请删除上面的/

【讨论】:

    【解决方案2】:

    您需要解决什么问题?什么是动态的?对于这个 url,假设 posfix 将离开 _cast 你可以使用表达式:

    (\d+)_cast
    

    所以 ID 将在第一个选择组中

    【讨论】:

    • 或者只是\d+(?=_cast),整个匹配就是id
    【解决方案3】:

    我确实找到了获取 id 的方法 - 它可能效率不高,但现在可以使用 我做了

    my $dir_path = "/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ ";
    my @keys =(split(/[\/_]+/,$dir_path));
    print "Key is $keys3[9]\n";
    

    它打印出 11894373690 谢谢大家的建议!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 2012-03-10
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多