Substituir determinado texto ocorrido entre chaves

3

Eu tenho um arquivo de amostra da seguinte forma:

 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"
 }

Estou tentando substituir PortId = "A" como PortId = "A B" , mas apenas no módulo CLKA{ } .

Eu tentei executar certas modificações no código dado como

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

na postagem anterior remova o texto entre chaves

Eu tentei esse sed ':again;$\!N;$\!b again; s/CLKA {[^}]*}//g' , mas excluí o módulo CLKA { } inteiro

    
por JigarGandhi 02.12.2014 / 08:20

1 resposta

4

Tente isto:

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

Este comando sed adiciona o caractere B ao final do padrão PortId = "A , que está entre duas palavras CLKA e TEST1A .

Você também pode usar start ( ^ ) e end ( $ ) da linha para corresponder / substituir apenas PortId = "A" dentro do módulo CLKA { ... } . ^ CLKA {$ corresponde à linha que contém apenas CLKA { e ^ }$ corresponde à linha se apenas contiver }

Entrada:

CLKA {
     PortId = "A"
}

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

Comando:

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

Saída:

CLKA {
     PortId = "A"
}

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

Observe que os espaços após ^ , porque você tem um espaço antes de cada linha (no exemplo fornecido), se você não tiver esse espaço, remova-os.

    
por 02.12.2014 / 09:08