perl - 使用split或regular表达式从文本文件中获取目录名称

时间:2012-01-16 16:32:29

标签: perl

我有一个文本文件,其中包含一个目录名列表,如下所示:

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中学习这个。为此使用拆分或正则表达式会更好吗?有人能给我一个很好的例子吗?

4 个答案:

答案 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])