Text-Processing

如何將 named.conf 的區域塊重新格式化為單行?

  • August 23, 2018

由於我不會在這裡討論的原因,我需要製作一個舊 CentOS 5.10 伺服器的 named.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”;};
區域“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;共同允許轉移;}; };

我和我的 CIO 未能成功搜尋將 named.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 進行實驗”這樣的大方向——將不勝感激。謝謝!

在 Vim(或只是)中打開文件vi並輸入:

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

瞧,你完成了。


這將g在以 開頭的每一行上局部執行zone,命令:

.,/^}/j

這意味著,從目前行 ( .) 到以右大括號開頭的下一行,將j所有這些行放在一起。


如果您需要編寫腳本,請使用vi的腳本形式,ex

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

試試這個:

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; }; };

引用自:https://unix.stackexchange.com/questions/464175