print lines matching a pattern exactly 'n' times
( categories: one liners | regular expressions )The key is to do the match with the 'g' modifier in list context, then compare the result in scalar context to obtain the number of matches.
Example:
Print the lines in 'file.txt' that have the string 'for' repeated exactly 3 times:
perl -ne 'print if ( ( () = /for/g ) == 3 )' file.txt
match the shortest possible string
( categories: regular expressions )The pattern matching quantifiers of a Perl regular expression are "greedy" (they match the longest possible string). To force the match to be "ungreedy", append a ? to the pattern quantifier (*, +).
Example:
#!/usr/bin/perl
$string="111s11111s";
#-- greedy match
$string =~ /^(.*)s/;
print "$1\n"; # prints 111s11111
#-- ungreedy match
$string =~ /^(.*?)s/;
print "$1\n"; # prints 111
