perl - использовать split или регулярное выражение для получения имен каталогов из текстового файла - PullRequest
1 голос
/ 16 января 2012

У меня есть текстовый файл со списком имен каталогов, таких как:

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 ]

7 голосов
/ 16 января 2012
$ perl -lane 'print $F[-1]' input.txt > output.txt

Объяснение

  • -a

    autosplit, по умолчанию расщепление строки по пробелам, поэтому, если ваш путь содержит пробелы, команда не будет работать

  • -l

    автоматическая обработка конца строки, поэтому вам не нужно явно chomp при чтении или добавить "\n" при печати

  • -n

    читать input.txt построчно

  • print $F[-1]

    печатает последний элемент массива @F, который генерируется, когда строка (сохраненная в $_) имеет значение split

  • >

    перенаправление оболочки

См. perldoc perlrun для получения дополнительной информации о параметрах командной строки Perl.

3 голосов
/ 16 января 2012

В Perl мы предпочитаем модули перед специальным регулярным выражением. См. Файл :: Листинг .

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 голосов
/ 16 января 2012

Вы используете split (), когда хотите сказать, что пропустить.Вы используете регулярное выражение, когда хотите сказать, что оставить.Вы используете substr () (или распаковываете) для данных фиксированной ширины.

#!/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
0 голосов
/ 16 января 2012

Мне удалось захватить путь с помощью регулярного выражения:

\d+:\d+\s(.*[^\s])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...