Remplacer certains text qui se sont produits entre accolades

J'ai file d'échantillon comme suit:

WEA { Direction = Input Tag = WriteEnable PortId = "A" } MEA { Direction = Input Tag = MemoryEnable PortId = "A" } CLKA { Direction = Input Tag = Clock PortId = "A" } TEST1A { Direction = Input Tag = None TieLevel = TestBench PortId = "A" SafeValue = "1'b0" } 

J'essaie de replace PortId = "A" comme PortId = "AB" mais uniquement dans le module CLKA{ } .

J'ai essayé d'exécuter certaines modifications sur le code donné comme

 sed ':again;$\!N;$\!b again; s/{[^}]*}//g' file 

sur le post précédent supprimer le text dans les accolades

J'ai essayé ce sed ':again;$\!N;$\!b again; s/CLKA {[^}]*}//g' sed ':again;$\!N;$\!b again; s/CLKA {[^}]*}//g' mais supprimé le CLKA { } entier CLKA { }

Essaye ça:

 sed '/CLKA/,/TEST1A/ { s/PortId = \"A/& B/; }' file 

Cette command sed ajoute le caractère B à la fin du motif PortId = "A qui est entre deux mots CLKA et TEST1A .

Vous pouvez également utiliser start ( ^ ) et end ( $ ) de la ligne pour PortId = "A" / ne replace que PortId = "A" dans le CLKA { ... } . ^ CLKA {$ correspond à la ligne qui ne contient que CLKA { et ^ }$ correspond à la ligne si elle contient uniquement }

Consortingbution:

 CLKA { PortId = "A" } CLKA { Direction = Input Tag = Clock PortId = "A" } 

Commander:

 sed '/^ CLKA {$/,/^ }$/ { s/PortId = \"A/& B/; }' file 

Sortie:

 CLKA { PortId = "A" } CLKA { Direction = Input Tag = Clock PortId = "AB" } 

Notez que les espaces après ^ parce que vous avez un espace avant chaque ligne (dans votre exemple), si vous n'avez pas cet espace, supprimez-les.