2017-09-01 3 views
0

Par exemple, la netlist est:Extrait de cellule spécifique netlist

INV i0 (.I(a0), 
    .O(b0)); 

BUF i1 (.I(a1), 
    .O(b1)); 

Je voudrais extraire la cellule BUF du netlist et écrire dans un autre fichier. Comme vous savez qu'il y a toujours un retour à la ligne dans une cellule d'une netlist, quel est le format regex pour localiser les cellules que je veux extraire?

J'ai essayé grep ^BUF.*$ mais il ne retournera que BUF i1 (.I(a1), car il y a un retour à la ligne, j'ai échoué à extraire toute la cellule BUF.

+0

Pour analyser correctement Verilog, utilisez https://metacpan.org/ pod/Verilog-Perl – toolic

Répondre

1

solution grep:

$ grep -Poz 'BUF[^;]+;' input.txt 
BUF i1 (.I(a1), 
.O(b1)); 
BUF i1 (.I(a1), 
.O(b1)); 

awk solution:

$ cat vlg.awk 
BEGIN { RS="" } 
/BUF/ 

entrée :

$ cat input.txt 
INV i0 (.I(a0), 
.O(b0)); 

BUF i1 (.I(a1), 
.O(b1)); 

INV i0 (.I(a0), 
.O(b0)); 

BUF i1 (.I(a1), 
.O(b1)); 

sortie:

$ awk -f vlg.awk input.txt 
BUF i1 (.I(a1), 
.O(b1)); 
BUF i1 (.I(a1), 
.O(b1)); 

ou tout simplement commandline: $ awk 'BEGIN {RS=""} /BUF/' input.txt

Note: Dans la solution awk, la différence entre RS="" et RS="\n\n+" faut noter ici. La première option ignore les nouvelles lignes principales dans les données d'entrée et - si un fichier se termine sans lignes vides supplémentaires après le dernier enregistrement - la nouvelle ligne finale est supprimée de l'enregistrement. En utilisant la deuxième option, ce traitement spécial n'est pas fait. Lisez à ce sujet dans gawk docs. commentaires d'occasion par Ed Morton.`

+1

Vous devriez mentionner que les solutions awk ne fonctionneront que dans GNU awk à cause du RS multi-caractères. Pour qu'ils travaillent dans n'importe quel awk, changez RS = "\ n \ n" 'en RS =" "'. De même, dans awk '/ BUF/{print $ 0}' est normalement écrit simplement '/ BUF /' puisque '{print $ 0}' est l'action par défaut étant donné une condition vraie. Si vous pouvez générer plusieurs enregistrements, vous devez également définir 'ORS =" \ n \ n "' pour qu'il corresponde au format de l'entrée qui est séparé de la ligne vide. –

+0

Vous devez mentionner que 'RS =" "' provoque l'ignorance des nouvelles lignes principales dans le fichier de données d'entrée et si un fichier se termine sans lignes vides supplémentaires après le dernier enregistrement, le retour à la ligne final est supprimé de l'enregistrement. Ergo: c'est un +1. L'impression explicite devrait partir, je suis d'accord. L'addition 'ORS =" \ n \ n "' est une supposition. –

+0

S'il y avait des lignes complètement vides au début du fichier alors oui ils seraient ignorés mais a) pourquoi seraient-ils là et b) s'ils étaient alors pourquoi ne devraient-ils pas être ignorés et c) le comportement du paragraphe Le mode est déjà bien documenté et cohérent avec la façon dont les blancs dans les enregistrements sont ignorés lors de l'utilisation du FS par défaut - aucun des deux ne doit être décrit chaque fois qu'il est utilisé. Une fin de fichier sans lignes vides ne provoquera pas le retour à la ligne finale. Oui, une hypothèse doit être faite sur la question de savoir si l'OP veut des nouvelles lignes entre les enregistrements de sortie comme dans son entrée ou non. –

1

Avec sed:

sed -n '/^BUF/{N;p}' file 

Lorsque ^BUF se trouve, la ligne est fusionnée avec la ligne suivante (N) et de sortie (p).

0

grep oneliner

grep "BUF " -A1 input >> output 

Pour chaque BUF jeu, assortie d'impression et une ligne après.

fichier de sortie:

BUF i1 (.I(a1), 
    .O(b1)); 
0

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)); 
$