名前付き.confの領域ブロックを1行に再フォーマットするにはどうすればよいですか?

名前付き.confの領域ブロックを1行に再フォーマットするにはどうすればよいですか?

ここで詳しく説明しないため、以前の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-modeofawkとツールとそのツールの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; }; };

関連情報