Supposons que nous effectuions une recherche de motifs regex multilignes sur un tas de fichiers et que nous voulions extraire les correspondances de grep. Par défaut, les sorties grep sont séparées par des retours à la ligne, mais étant donné que nous effectuons des tracés multilignes, cela crée l'inconvénient que nous ne pouvons pas facilement extraire les correspondances individuelles.Comment rendre la sortie grep séparée par des caractères NULL?
Exemple
grep -rzPIho '}\n\n\w\w\b' | od -a
En fonction des fichiers dans votre arborescence de fichiers, cela peut donner une sortie comme
0000000 } nl nl m y nl } nl nl i f nl } nl nl m
0000020 y nl } nl nl m y nl } nl nl i f nl } nl
0000040 nl m y nl
0000044
Comme vous pouvez le voir, nous ne pouvons pas partager sur les nouvelles lignes pour obtenir les résultats pour un traitement ultérieur , puisque les correspondances contiennent des caractères de nouvelle ligne eux-mêmes.
Ce qui ne fonctionne fonctionne pas
Maintenant, le --null
(ou -Z
) uniquement en association avec -l
, ce qui rend grep seule liste des noms de fichiers au lieu de matches, donc cela ne suffit pas ici.
Notez qu'il ne s'agit pas d'un doublon de Is there a grep equivalent for find's -print0 and xargs's -0 switches?, car les exigences de cette question sont différentes, ce qui permet de répondre à l'aide de techniques alternatives.
Alors, comment pouvons-nous faire en sorte que cela fonctionne? Peut-être utiliser grep en conjonction avec d'autres outils?
Je vais aller avec "vous ne pouvez pas" ici si 'grep' lui-même ne peut pas le faire pour vous (et qui dit que vous n'avez pas' NUL' dans vos données correspondantes pour commencer) . Vous avez abusé un peu de 'grep 'pour faire ce travail déjà. J'utiliserais la sortie 'od' (ou similaire) ou j'utiliserais un outil autre que' grep' pour contrôler mieux la sortie ('awk' ou' perl' ou autre chose). –
Un tuple de nom de fichier, de décalage d'octet et de longueur de correspondance vous permettrait de collecter les correspondances réelles lorsque vous en aurez besoin. Je ne pense pas que ce soit faisable avec 'grep' mais l'implémenter en Python ou en Perl ne devrait pas être difficile. – tripleee
Pouvez-vous ajouter un exemple de texte à votre question, et la sortie attendue? Je recommande également d'utiliser 'awk' pour cela. – miken32