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

당신이 원한다고 가정첫 번째두 개의 동일한 블록:

$ 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

관련 정보