Однострочная строка командной строки Perl для поиска совпадений регулярных выражений, занимающих несколько строк? - PullRequest
1 голос
/ 13 января 2011

Например, у меня есть файл foo.txt, который содержит

abc
bcc
ccc
baa

и я хочу вернуть индексы всех экземпляров "c \ nb" (в этом случае строка находится в начале с третьего и одиннадцатого символов файла). Какой самый простой способ сделать это?

Ответы [ 3 ]

4 голосов
/ 13 января 2011

Если вы уверены, что файл достаточно мал для удобного размещения в памяти, вы можете просто поместить его в переменную и применить к нему регулярное выражение:

$ perl -0777 -ne 'print $-[0], "\n" while /c\nb/g' foo.txt

В противном случае:

$ perl -ne 'print $n - 2, "\n" if /^b/ && $last =~ /c$/; $last = $_; $n += length' foo.txt

Обратите внимание, что эти решения зависят от входного файла, содержащего только символы ASCII.

3 голосов
/ 13 января 2011
#!/usr/bin/perl

my $s = 'abc
bcc
ccc
baa';

while ($s =~ /c\nb/mg ) {
  print pos($s), "\n"
}

это выдаст 5, 13 (функция pos возвращает индекс конца матча, но вы должны быть в состоянии это компенсировать).

1 голос
/ 13 января 2011

Я уверен, что есть достойное решение для регулярных выражений, но я вернусь к более старой index функции:

$_ = q[abc
bcc
ccc
baa];

my $z; print $z++,"\n" while 0<=($z=index($_,"c\nb",$z));


2
10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...