sed - 一度だけ現れる

sed - 一度だけ現れる

次の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

関連情報