괄호 사이를 연결하는 선

괄호 사이를 연결하는 선

중괄호 사이에 가변 개수의 줄을 연결해야 합니다. 중첩되어 특정 접두사 패턴으로 시작하는 중괄호만 연결하면 됩니다.

header {

category1 (a) {
field1 : value1 ;
field2 : value2 ;
...
fieldn : valuen ;
}

new cat1 (b) {
newfield1 : newvalue1 ;
newfield2 : newvalue2 ;
....
newfieldn : newvaluen ;
}

...

}

범주 및 필드 이름은 가변적이며 후행 ";" 앞에 공백이 올 수도 있고 없을 수도 있습니다. 줄 앞이나 단어/구분 기호 사이에 공백이나 탭이 있을 수 있습니다.

출력은 다음과 같아야 합니다.

header {
category1 (a) { field1 : value1 ; field2 : value2 ; ... fieldn : valuen ; }
new cat1 (b) { newfield1 : newvalue1 ; newfield2 : newvalue2 ; .... newfieldn : newvaluen ; }
}

저는 CentOS를 사용하고 있으므로 sed/awk/perl을 사용할 수 있습니다.

감사해요!

답변1

노력하다

$ awk '
/^ *$/          {next
                }
/cat.*{/        {while (! /}/)  {getline X
                                 $0 = $0 X
                                }
                }
1
' file
header {
category1 (a) {field1 : value1 ;field2 : value2 ;...fieldn : valuen ;}
new cat1 (b) {newfield1 : newvalue1 ;newfield2 : newvalue2 ;....newfieldn : newvaluen ;}
...
}

답변2

다중 문자 RS 및 RT가 있는 GNU awk의 경우 중간 부분이 수행됩니다.

$ awk -v RS='[^\n]+{[^{}]+}' '{$0=RT; $1=$1} RT' file
category1 (a) { field1 : value1 ; field2 : value2 ; ... fieldn : valuen ; }
new cat1 (b) { newfield1 : newvalue1 ; newfield2 : newvalue2 ; .... newfieldn : newvaluen ; }

첫 번째와 마지막 줄을 인쇄하는 것은 head -1 및 tail -1만큼 간단합니다.

$ head -1 file; gawk -v RS='[^\n]+{[^{}]+}' '{$0=RT; $1=$1} RT' file; tail -1 file
header {
category1 (a) { field1 : value1 ; field2 : value2 ; ... fieldn : valuen ; }
new cat1 (b) { newfield1 : newvalue1 ; newfield2 : newvalue2 ; .... newfieldn : newvaluen ; }
}

또는 관심이 있다면 awk 스크립트에서 이를 수행하는 방법을 알아낼 수도 있습니다. 이는 특별히 어렵지 않으며 지금보다 더 많은 생각이 필요할 뿐입니다!

답변3

이는 대부분 원하는 작업을 수행하지만 값과 세미콜론을 생략하면 사이에 공백이 추가되지 않습니다.

입력이 file.txt에 있다고 가정합니다.

tr "\n" " " < file.txt | tr "\t" " " | tr -s " " | sed "s/}/}\n/g" | sed "s/header {/header {\n/" | sed "s/^ //g"

1) 기존 줄 바꿈을 모두 공백으로 바꿉니다.

tr "\n" " "

2) 모든 탭 문자를 공백으로 바꿉니다.

tr "\t" " "

3) 모든 공백을 하나의 공백으로 대체

tr -s " "

4) 모든 오른쪽 대괄호를 오른쪽 대괄호와 개행 문자로 교체

sed "s/}/}\n/g"

5) 초기 "헤더 {" 뒤에 개행 문자를 추가합니다.

sed "s/header {/header {\n/"

6) 다음 줄에서 선행 공백을 제거합니다.

sed "s/^ //g"

관련 정보