Предполагая, что $ content содержит весь файл, вы должны сделать что-то вроде:
my ($config) = $content =~ m/\n!\n(vserver foo2[^!]*)/sm;
при условии, что у вас нет '!' где-то в вашей конфигурации.
Но я думаю, что лучший способ сделать это - запустить цикл и пропустить регулярное выражение:
при условии, что $ fh является дескриптором файла:
my $line;
# cut the leading lines
do {
$line = <$fh>;
chomp $line;
while ($line ne "!");
while ($line = <$fh>) {
chomp $line;
my $found = ($line eq "vserver foo2");
while ($line = <$fh>) {
chomp $line;
break if $line eq "!";
say $line if $found;
}
break if $found;
}