次の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
欲しいと仮定最初2つの同じブロック:
$ 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
}
}
Range は、/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
そしてアッ必要なセルデータを蓄積し、深さ({=number})が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