Scripting

Bash - 更改文件配置格式

  • April 16, 2019

我想改變:

這:

client 192.168.100.1 {
   secret = ThisIStheSECRET
   shortname = HOSTNAME
}
client 192.168.100.2 {
   secret = ThisIStheSECRET2
   shortname = HOSTNAME2
}

那:

client HOSTNAME { secret = ThisIStheSECRET, ipaddr = 192.168.100.1 }
client HOSTNAME2 { secret = ThisIStheSECRET2, ipaddr = 192.168.100.2 }

這該怎麼做?使用什麼工具?

一個簡單的awk腳本:

awk '
   /^client/               { ipaddr    = $2                              }
   /^[[:blank:]]*shortname/{ shortname = $3                              }
   /^[[:blank:]]*secret/   { secret    = $0; sub("^[^=]*= ", "", secret) }
   /^}/ {
       printf("client %s { secret = %s, ipaddr = %s }\n",
           shortname, secret, ipaddr);
   }' file

當我們在輸入文件中找到所需的資訊時,只需解析它們,當我們在行首點擊 a}時,我們以正確的格式輸出收集到的資訊。

文本的解析secret是特殊的,因為我們期望它包含任何東西,甚至是欄位分隔符。它只是從將變數設置secret為整行開始,然後刪除所有內容,直到第=一個空格和之後的單個空格。

給定文件

client 192.168.100.2 {
   secret = ThisIStheSECRET2
   shortname = HOSTNAME2
}
client 10.0.0.1 {
   secret =     This is it, the secret!, ipaddr = 10.0.0.1
   shortname = myhost.local
}

(注意秘密開頭的四個空格),這會產生

client HOSTNAME2 { secret = ThisIStheSECRET2, ipaddr = 192.168.100.2 }
client myhost.local { secret =     This is it, the secret!, ipaddr = 10.0.0.1, ipaddr = 10.0.0.1 }

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