Как я могу искать несколько файлов строку в Perl?

Этот вопрос может также помочь.

11
задан Sinan Ünür 5 October 2009 в 13:03
поделиться

7 ответов

Расширение хорошего ответа, предоставленного Джонатаном Леффлером:

Имя файла, в котором было найдено совпадение, находится в $ ARGV , и с небольшим изменением номер строки может можно найти в $. . Пример:

while (<>) {
  print "$ARGV:$.:$_" if /pattern/;
} continue {
  close ARGV if eof; # Reset $. at the end of each file.
}

Более того, если у вас есть список имен файлов, а их нет в командной строке, вы все равно можете получить волшебное поведение ARGV . Смотрите:

{
  local @ARGV = ('one.txt', 'two.txt');
  while (<>) {
    print "$ARGV:$.:$_" if /Okay/;
  } continue {
    close ARGV if eof;
  }
}

Это обычно полезный шаблон для выполнения построчной обработки ряда файлов, какими бы они ни были, даже если я могу порекомендовать File :: Grep или App :: Подтвердите для этой конкретной проблемы :)

8
ответ дан 3 December 2019 в 05:58
поделиться

Самый простой способ - перечислить файлы в командной строке, а затем просто использовать:

while (<>)
{
    print if m/Okay/;
}
3
ответ дан 3 December 2019 в 05:58
поделиться

В системе, где аргументы командной строки правильно раскрыты, вы можете использовать:

[sinan@host:~/test]$ perl -ne 'print "$.:$_" if /config/' *
1:$(srcdir)/config/override.m4

Проблема с Windows:

C:\Temp> perl -ne "print if /perl/" *.txt
Can't open *.txt: Invalid argument.

В Windows вы можете сделать:

C:\Temp> for %f in (*.txt) do perl -ne "print if /perl/" %f

Но вы можете просто использовать cmd.exe встроенный findstr или инструмент командной строки grep .

4
ответ дан 3 December 2019 в 05:58
поделиться

File :: Grep - вот что вам нужно здесь

2
ответ дан 3 December 2019 в 05:58
поделиться

поместить файлы в цикл for или что-то в этом роде:

ie

for $file ('F:\wyvern.txt','F:\casanova.txt') {

open(TXT, $file);
while($line = <txt>) {
     print "$line" if $line =~ /Okay/;
    }
close TXT;
}
1
ответ дан 3 December 2019 в 05:58
поделиться

Ладно, я полный болван. Но подведем итог: теперь я могу искать указанную строку в одном текстовом файле или нескольких текстовых файлах. Я все еще пытаюсь понять, как поступить со всеми файлами в одной папке. работают следующие коды:

Код 1:

#!/usr/bin/perl
$file = 'F:\one.txt';
open(txt, $file);
while($line = <txt>) {
  print "$line" if $line =~ /Okay/;
}
close(txt);

Код 2:

#!/usr/bin/perl
{
  local @ARGV = ('F:\wyvern.txt', 'F:\casanova.txt');
  while (<>) {
    print "$ARGV:$.:$_" if /Okay/;
  } continue {
    close ARGV if eof;
  }
}

Еще раз спасибо за вашу помощь. Я очень ценю это.

0
ответ дан 3 December 2019 в 05:58
поделиться

Просто поправьте вашу строку: , я предпочитаю использовать ключевое слово glob - оно работает так же в этом контексте и позволяет избежать путаницы в различных случаях использования угловых скобок в Perl. То есть:

@files = glob "F: / романы / *";

Подробнее см. perldoc glob .

2
ответ дан 3 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: