Roo*_*asa 2 sed text-processing
我正在使用以下 SED 命令:
sed '/cell.* '"alatch {"'/,/^}/p' -n file
Run Code Online (Sandbox Code Playgroud)
输入文件如下:
cell abc {
pins on T {
a b c
}
}
cell xyz {
pins on T {
x y z
}
}
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
Run Code Online (Sandbox Code Playgroud)
预期如下:
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
Run Code Online (Sandbox Code Playgroud)
需要的是只有第一次出现应该是输出。命令有什么建议吗?
假设您想要两个相同块中的第一个:
$ sed '/cell alatch {/,/^}/!d; /^}/q' file
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
Run Code Online (Sandbox Code Playgroud)
该/cell alatch {/,/^}/范围是,你希望得到尽可能输出线的范围。
该sed表达式首先删除所有行未在此范围内,然后退出作为一旦}在一个行的开始找到。该q指令将sed在输出当前行后导致终止,因此最终}将打印出来。
执行d指令立即跳到下一个输入行并分支回到编辑脚本的开头,因此q指令无法执行,除非它在不会导致d执行的范围内。
使用awk,使用应该让人想起sed上面代码的代码实现相同的效果:
$ awk '/cell alatch {/,/^}/ { print; if ($0 ~ /^}/) exit }' file
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,这更接近sed命令
sed -n '/cell alatch {/,/^}/{ p; /^}/q; }' file
Run Code Online (Sandbox Code Playgroud)
它做同样的事情。