2015-10-20 40 views
1

对于下面提供的示例数据和程序,请帮助我找到正确的正则表达式。如何仅提取文件系统名称/

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

用什么模式来提取根,数据1,数据3和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; 
+0

你可以使用这个'(?<= /)\ w + $' –

+1

如果你正在操作的路径,你应该使用的路径操作模块,而不是一个正则表达式。选择一个:[Path :: Tiny](https://metacpan.org/pod/Path::Tiny),[Path :: Class](https://metacpan.org/pod/Path::Class),[文件::规格(https://metacpan.org/pod/File::Spec)。 –

回答

1

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

/[^\/]+$/m 

RegEx Demo

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

0

下面是一个简单的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了解详情。

5

的Perl:

use File::Basename qw(basename); 

my $fn = basename($qfn); 

的bash:

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

的bash(管道):

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

猜测这将是更自我解释:

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; 

结果:

/root: 
     File: root 
     Directory:/

/dev/data1: 
     File: data1 
     Directory: /dev 

/dev/data1/data3: 
     File: data3 
     Directory: /dev/data1 

/usr/local/oravg/oradat: 
     File: oradat 
     Directory: /usr/local/oravg 
0

只要你锚选择到线的末端,并禁止任何斜杠/

[^/]*$ 

demo

相关问题