我正在使用以下 SED 命令:
sed '/cell.* '"alatch {"'/,/^}/p' -n file
输入文件如下:
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
}
}
输出如下:
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
}
}
预期输出如下:
cell alatch {
pins on T {
VSS VDDPI VDDP
}
pins on L {
IN CT CB
}
pins on R {
OUT
}
inputs {
CB CT IN
}
outputs {
OUT
}
}
所需要的是只有第一次出现的情况才是输出。对指挥有什么建议吗?
答案1
假设你想要第一的两个相同的块:
$ 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
}
}
范围/cell alatch {/,/^}/
是您想要作为输出获得的行的范围。
表达式sed
首先删除所有行不是在此范围内,然后退出一旦}
在行首找到 a 。该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
}
}
其实这个更接近sed
命令
sed -n '/cell alatch {/,/^}/{ p; /^}/q; }' file
它做同样的事情。
答案2
和awk我们积累所需的单元数据,当深度({=数量})达到0时,我们转储单元数据并退出。
awk '
BEGIN { ORS = "" }
/cell alatch \{/ {inCell=1}
!inCell {next}
{data = data $0 RS}
/\}/ {depth--}
/\{/ {depth++}
!depth {
print data
exit
}
' ./file
使用GNU sed 与上面的 awk 代码的想法相同。
sed -e '
/cell alatch {/!d
/\n/!{h;s/.*/x/;x;}
$d;N
/}$/{x;s/x//;/x/!{x;q;};x;}
/{$/{x;s/$/x/;x;}
s/^/\n/;D
' file