2011-01-13 1 views
1

Например, у меня есть файл foo.txt, содержащегоPerl командной строки с одним слоем, чтобы найти регулярное выражение, которое охватывает несколько строк?

abc 
bcc 
ccc 
baa 

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

ответ

4

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

$ 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
#!/usr/bin/perl 

my $s = 'abc 
bcc 
ccc 
baa'; 

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

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

+0

Как насчет командной строки? – jonderry

+0

Да, Perl позволяет вам запускать полные программы из командной строки (http://p3rl.org/run#%2A-e%2A-_commandline_). – daxim

+0

@jonderry, попробуйте 'perl -e 'my $ s; while (<>) {$ s. = $ _} while ($ s = ~/c \ nb/mg) {print pos ($ s) - 2, "\ n"} ' cam

1

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

$_ = q[abc 
bcc 
ccc 
baa]; 

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


2 
10 
Смежные вопросы