여기에서 자세히 설명하지 않기 때문에 이전 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-mode
of 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; }; };