如何在没有/的情况下提取文件系统名称

时间:2015-10-20 21:25:51

标签: regex perl

对于以下提供的示例数据和程序,请帮我找到正确的正则表达式。

#cat df.dat
/root                      
/dev/data1                 
/dev/data1/data3
/usr/local/oravg/oradat

用什么模式来提取root,data1,data3和oradat而不用" /"

$ perl grepperl.pl -pattern =' ' df.dat

$ cat grepperl.pl
#! /usr/bin/perl -s -wnl
BEGIN {
# -pattern='RE' switch is required
$pattern or
warn "Usage: $0 -pattern='RE' [ file1 ... ]\n" and
exit 255;
}
/$pattern/ and print;

5 个答案:

答案 0 :(得分:5)

的Perl:

use File::Basename qw( basename );

my $fn = basename($qfn);

击:

fn="$( basename "$qfn" )"

bash(管道):

... | xargs -n 1 basename | ...

答案 1 :(得分:1)

您可以在MULTILINE模式下使用此否定basedregex:

/[^\/]+$/m

RegEx Demo

[^\/]+$将匹配在行结束前不是/的任何字符中的一个或多个。

答案 2 :(得分:0)

这是一种简单的bash方式(虽然bash未在问题中标记)

$ cat test 
/root                      
/dev/data1                 
/dev/data1/data3
/usr/local/oravg/oradat

$ while read line; do echo ${line##*/}; done < test 
root
data1
data3
oradat

有关详细信息,请参阅Bash Substring Removal

答案 3 :(得分:0)

猜猜这会更加自我解释:

COALECE()

结果:

use File::Basename;

my @paths = qw (/root                      
                /dev/data1                 
                /dev/data1/data3
                /usr/local/oravg/oradat);   

for my $path (@paths) {
    my $dirname  = dirname ($path);
    my $filename = basename ($path);
    print "$path:\n\tFile: $filename\n\tDirectory: $dirname\n\n";
}

1;

答案 4 :(得分:0)

只需将您的选择锚定到该行的末尾,并禁止任何斜杠字符/

[^/]*$

请参阅demo