Cela fonctionne avec vigueur à toute awk sur tout système UNIX:
awk -v RS= '$1=="BUF"' file
et si vous pouvez avoir plusieurs blocs « BUF » dans l'entrée, vous serez probablement vouloir la même ligne vide dans la sortie que vous avez dans l'entrée alors vous utiliseriez ceci:
awk -v RS= -v ORS='\n\n' '$1=="BUF"' file
La principale différence entre la réponse ci-dessus et toute autre réponse est que, puisqu'elle effectue une comparaison exacte des chaînes sur la première chaîne non vide dans chaque enregistrement, elle fonctionnera indépendamment de l'espace blanc précédant BUF sur la ligne, fonctionnera même si un texte similaire (par exemple BUFFER) apparaît sur d'autres lignes et fonctionne même si BUF apparaît au mauvais endroit dans d'autres parties du fichier (par exemple dans les commentaires?).
Par exemple, avec ce fichier d'entrée:
$ cat file
INV i0 (.I(a0), # not BUF here
.O(b0));
BUF i1 (.I(a1),
.O(b1));
BUFFER i1 (.I(a1),
.O(b1));
Voici comment toutes les solutions proposées jusqu'à présent comporterons:
$ awk -v RS= '$1=="BUF"' file
BUF i1 (.I(a1),
.O(b1));
$
$ sed -n '/^BUF/{N;p}' file
BUFFER i1 (.I(a1),
.O(b1));
$
$ awk 'BEGIN {RS=""} /BUF/' file
INV i0 (.I(a0), # not BUF here
.O(b0));
BUF i1 (.I(a1),
.O(b1));
BUFFER i1 (.I(a1),
.O(b1));
$
$ grep -Poz 'BUF[^;]+;' file
BUF here
.O(b0));BUF i1 (.I(a1),
.O(b1));BUFFER i1 (.I(a1),
.O(b1));$
$
$ grep "BUF " -A1 file
INV i0 (.I(a0), # not BUF here
.O(b0));
--
BUF i1 (.I(a1),
.O(b1));
$
Pour analyser correctement Verilog, utilisez https://metacpan.org/ pod/Verilog-Perl – toolic