我有一个文本文件,其中包含一个目录名列表,如下所示:
drwxr-x--- - test_hd open_review 0 2011-10-31 14:17 /proj/open_review/20111030
drwxr-x--- - test_hd open_review 0 2011-11-01 16:10 /proj/open_review/20111031
drwxr-x--- - test_hd open_review 0 2011-11-02 17:12 /proj/open_review/20111101
我想提取目录以包含“/”,例如“/ proj / open_review / 20111030”在另一个文件中。
我想在perl和使用cut中学习这个。为此使用拆分或正则表达式会更好吗?有人能给我一个很好的例子吗?
答案 0 :(得分:7)
$ perl -lane 'print $F[-1]' input.txt > output.txt
<强>解释强>
-a
autosplit,默认为在空格上拆分行,所以如果你的路径包含空格,那么命令将不起作用
-l
自动行结束处理,因此您无需在阅读时明确chomp
或在打印时添加"\n"
-n
逐行阅读input.txt
print $F[-1]
打印@F
数组的最后一个元素,当该行(存储在$_
中)为split
>
shell重定向
有关Perl命令行开关的详细信息,请参阅perldoc perlrun
。
答案 1 :(得分:3)
如果要说要跳过的内容,请使用split()。当你想要说什么时,你使用正则表达式。您在固定宽度数据上使用substr()(或unpack)。
#!/usr/bin/perl
use warnings;
use strict;
while (<DATA>) {
chomp;
my $fname = substr $_, 63;
print "$fname\n";
}
__DATA__
drwxr-x--- - test_hd open_review 0 2011-10-31 14:17 /proj/open_review/20111030
drwxr-x--- - test_hd open_review 0 2011-11-01 16:10 /proj/open_review/20111031
drwxr-x--- - test_hd open_review 0 2011-11-02 17:12 /proj/open_review/20111101
答案 2 :(得分:3)
在Perl中,我们更喜欢模块而非ad-hoc正则表达式。请参阅File::Listing。
use File::Listing qw(parse_dir);
print $_->[0], "\n" for parse_dir <<'LS';
drwxr-x--- - test_hd open_review 0 2011-10-31 14:17 /proj/open_review/20111030
drwxr-x--- - test_hd open_review 0 2011-11-01 16:10 /proj/open_review/20111031
drwxr-x--- - test_hd open_review 0 2011-11-02 17:12 /proj/open_review/20111101
LS
/proj/open_review/20111030
/proj/open_review/20111031
/proj/open_review/20111101
答案 3 :(得分:0)
我能够用正则表达式捕获路径:
\d+:\d+\s(.*[^\s])