(9 réponses)
Fermé il y a 2 ans.
Est-il possible de faire une correspondance de modèle multiligne en utilisant sed
, awk
ou grep
? Prenons par exemple, je voudrais obtenir toutes les lignes entre {
et }
Il devrait donc pouvoir correspondre
1. {}
2. {.....}
3. {.....
.....}
Initialement, la question utilisait <p>
par exemple. Modification de la question pour utiliser {
et}
.
Réponse acceptée :
Bien que je sois d'accord avec le conseil ci-dessus, que vous voudrez obtenir un analyseur pour quelque chose de plus que minuscule ou complètement ad hoc, il est (à peine 😉 possible de faire correspondre des blocs multilignes entre accolades avec sed.
Voici une version de débogage du code sed
sed -n '/[{]/,/[}]/{
p
/[}]/a
end of block matching brace
}' *.txt
Quelques remarques,
- -n signifie "aucune ligne d'impression par défaut telle que traitée".
- ‘p’ signifie maintenant imprimer la ligne.
- La construction
/[{]/,/[}]/
est une expression de plage. Cela signifie scanner jusqu'à ce que vous trouviez quelque chose qui correspond au premier modèle(/[{]/)
ET puis scannez jusqu'à ce que vous trouviez le 2ème motif(/[}]/)
PUIS effectuez toutes les actions que vous trouvez entre les {} dans le code sed. Dans ce cas, "p" et le code de débogage. (non expliqué ici, utilisez-le, modifiez-le ou retirez-le selon ce qui vous convient le mieux).
Vous pouvez supprimer le débogage de fin de bloc /[}]/a lorsque vous prouvez à votre satisfaction que le code correspond bien aux blocs délimités par {,}.
Cet exemple de code ignorera tout ce qui n'est pas à l'intérieur d'une paire d'accolades.
Il sera, comme d'autres l'ont noté ci-dessus, facilement confus si vous avez des {,} supplémentaires intégrés dans des chaînes, des reg-exps, etc., OU où l'accolade fermante est la même ligne , (avec nos remerciements à fred.bear)
J'espère que cela vous aidera.