我有示例文件如下:
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 = "A
CLKA
TEST1A
您还可以使用行通知的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"
}
请注意,后面的空格^
是因为每行之前都有一个空格(在给定的示例中),如果没有这个空格,请删除它们。