명명된.conf의 영역 블록을 한 줄로 다시 포맷하려면 어떻게 해야 합니까?

명명된.conf의 영역 블록을 한 줄로 다시 포맷하려면 어떻게 해야 합니까?

여기에서 자세히 설명하지 않기 때문에 이전 CentOS 5.10 서버의 name.conf 파일 복사본을 만들고 복사본에 대해 몇 가지 텍스트 작업을 수행해야 했습니다. 최종 결과는 각 영역에 대한 정보를 별도의 행으로 결합해야 합니다. 또한 cron 작업으로 실행할 수 있도록 스크립트를 작성해야 합니다. 내가 시작한 방법의 예는 다음과 같습니다.

구역"." {
        힌트를 입력하세요.
        파일 "named.root";
};

영역 "somedomain.com" {
        장르마스터;
        파일 "somedomain.net";
        전송 허용 {
                11.11.11.11;
                22.22.22.22;
                공동으로 허용된 양도;
        };
};

영역 "otherdomain.com" {
        장르마스터;
        파일 "otherdomain.com";
        전송 허용 {
                33.33.33.33;
                44.44.44.44;
                55.55.55.55;
                공동으로 허용된 양도;
        };
};

다음은 편집된 파일에 표시되어야 하는 내용의 예입니다.

영역 "." { 입력 프롬프트; 파일 "named.root" };
zone "somedomain.com" {type master; 파일 "somedomain.net"; 함께 전송 가능 };
zone "otherdomain.com" {type master; 파일 "otherdomain.com"; 33.33.33.33; 55.55.55.55;

내 CIO와 나는 name.conf를 영역당 한 줄 형식으로 변환하는 기존 스크립트를 검색하지 못했습니다. tr 및 sed를 사용하여 1) 모든 탭을 공백으로 변환하고 2) 여러 연속 공백을 단일 공백으로 압축하는 데 성공했습니다. 결과는 내가 필요한 것에 더 가깝지만 원하는 줄바꿈을 유지하면서 원하지 않는 줄바꿈을 제거할 수는 없습니다. 다음은 거의 올바른 샘플 출력입니다.

구역"." {
 힌트를 입력하세요.
 파일 "named.root";
};
영역 "somedomain.com" {
 장르마스터;
 파일 "somedomain.net";
 전송 허용 {
 11.11.11.11;
 22.22.22.22;
 공동으로 허용된 양도,
 };
};
영역 "otherdomain.com" {
 장르마스터;
 파일 "otherdomain.com";
 전송 허용 {
 33.33.33.33;
 44.44.44.44;
 55.55.55.55;
 공동으로 허용된 양도,
 };
};

개행 문제를 해결하기 위해 몇 가지 제안된 sed, awk 및 tr 표현식을 테스트했지만 원하는 출력을 제공하지 못했습니다. "sed 및 x,y,z 실험"과 같은 일반적인 지침을 포함한 모든 제안 사항을 알려 주시면 매우 감사하겠습니다. 감사해요!

답변1

Vim에서(또는 직접) 파일을 열고 vi다음을 입력하세요.

:g/^zone/.,/^}/j

짜잔, 끝났습니다.


이는 다음 명령 g으로 시작하는 모든 줄에서 전역적으로 실행됩니다 .zone

.,/^}/j

이는 현재 줄( .)부터 닫는 중괄호로 시작하는 다음 줄까지 j모든 줄을 함께 배치한다는 의미입니다.


스크립트를 작성해야 하는 경우 vi스크립트 형식을 사용하세요 ex.

printf '%s\n' 'g/^zone/.,/^}/j' x | ex file.txt

답변2

이 시도:

sed -n '
    /^zone/,/^};/ H          # append current line to hold space in this range
    /^};/ {                  # at the end of the range:
        s/.*//               #   erase the current line
        x                    #   exchange pattern space with hold space
        s/\n//               #   remove first newline (before "zone")
        s/[[:space:]]\+/ /g  #   condense all other whitespace including newlines
        p                    #   and print this zone record
    }
' named.conf 

결과

zone "." { type hint; file "named.root"; };
zone "somedomain.com" { type master; file "somedomain.net"; allow-transfer { 11.11.11.11; 22.22.22.22; common-allow-transfer; }; };
zone "otherdomain.com" { type master; file "otherdomain.com"; allow-transfer { 33.33.33.33; 44.44.44.44; 55.55.55.55; common-allow-transfer; }; };

답변3

sed -e ':nextline' -e N -e 's/\n\s*\([^z]\)/\1/' -e 'tnextline' named.conf

답변4

paragraph-modeof awk및 도구와 해당 도구의 Perl범위 연산자를 사용하여 이 작업을 수행할 수 있습니다 .,sed

sed -e '
    /^zone/,/^$/!d
    H;/^zone/h;/^$/!{$!d;}
    g;s/[[:space:]]\{1,\}/ /g
    s/ $//
' input.file

awk -vRS= '{$1=$1}1' input.file

perl -pl -00e 's/\s+/ /g' input.file

perl -pl -00e 'tr/\t\040\n/ /s' input.file

산출:

zone "." { type hint; file "named.root"; };
zone "somedomain.com" { type master; file "somedomain.net"; allow-transfer { 11.11.11.11; 22.22.22.22; common-allow-transfer; }; };
zone "otherdomain.com" { type master; file "otherdomain.com"; allow-transfer { 33.33.33.33; 44.44.44.44; 55.55.55.55; common-allow-transfer; }; };

관련 정보