Это довольно сложно с одним проходом и еще сложнее, если вы не предполагаете, что старт должен быть одинаковым.
Вы можете написать Perl-скрипт, который сопоставляет регулярные выражения с предыдущими строками, например, так:
my @words_on_line = split(/ /, $current_line);
my $i = 0; my $substring = ''; my $expression = '';
do {
$expression = join(' ', $words_on_line[0..$i++]);
if ($previous_line =~ m/^$expression/) {
$substring = $expression;
}
} until ($substring ne $expression);
Затем вам также необходимо проверить следующую строку и, возможно, уменьшить совпадение подстроки, например, когда у вас есть
FOO a b c
FOO a b
FOO d
Первый матч (от 2 до 1) даст вам FOO a b
, но, сравнивая ниже, вы получите только FOO
.
Что сводится к следующему: вам нужно буферизовать ваши строки до тех пор, пока вы не получите строку без совпадения. Таким образом, вместо печати вы бы сделали что-то вроде
unless ($substring) {
push @buffer, $current_line;
foreach (@buffer) {
unless (m/$substring/) {
$buffer_substring = $substring;
}
}
} else {
print scalar @buffer, " $buffer_substring\n";
}
И тогда вы просто объедините это.
Если это не «первое общее начало, начинающееся с начала строки», вам нужно будет проверить каждую возможную последовательность слов по каждой возможной последовательности слов в других строках, что является чрезвычайно сложным и которое я не буду здесь воспроизводить.