HervéRenault.fr

Matcher des sauts de ligne dans grep

Je m'étonne d'avoir découvert ça si tardivement. Manifestement, ça ne sert pas souvent mais ça peut être utile.

Il faut utiliser conjointement les options -P (expressions rationnelles Perl) et -z ("finir les lignes de données par un octet nul")

Exemple

Matcher une ligne qui contient o suivie d'une ligne qui contient a :
( echo foo ; echo bar ; echo baz ) | grep -zP 'o.*\n.*a'

foo
bar
baz

L'important à retenir, c'est que . ne matche pas \n
contrairement à PHP avec l'option s dans preg_match('/o.*a/s', '')

Si on veut matcher tout caractère y compris le saut de ligne, il faut faire grep -zP 'o(.|\n)*a' qui ne va pas donner la même chose en sortie, évidemment :

foo
bar
baz

Note : on ne peut pas faire [.\n]*, ça ne marche pas avec grep.