
ここで詳しく説明しないため、以前の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をゾーンごとに1行形式に変換する既存のスクリプトを取得できませんでした。 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
ofawk
とツールとそのツールの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; }; };