替换大括号内出现的某些文本

替换大括号内出现的某些文本

我有示例文件如下:

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

我正在尝试替换PortId = "A"PortId = "A B"但仅在CLKA{ }模块中。

我尝试对给出的代码进行某些修改

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

在上一篇文章中删除大括号内的文本

我尝试了这个sed ':again;$\!N;$\!b again; s/CLKA {[^}]*}//g'但删除了整个CLKA { }模块

答案1

尝试这个:

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

此 sed 命令将字符附加到两个单词和之间的B模式末尾。PortId = "ACLKATEST1A

您还可以使用行通知的start( ^) 和 end( ) 来仅在模块内部进行匹配/替换。匹配仅包含的行并匹配仅包含的行$PortId = "A"CLKA { ... }^ CLKA {$ CLKA {^ }$ }

输入:

CLKA {
     PortId = "A"
}

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

命令:

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

输出:

CLKA {
     PortId = "A"
}

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

请注意,后面的空格^是因为每行之前都有一个空格(在给定的示例中),如果没有这个空格,请删除它们。

相关内容