다음 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