Bash - ファイル構成形式の変更

Bash - ファイル構成形式の変更

私は変更したい:

これ:

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 }

どうすればいいですか?どのツールを使用する必要がありますか?

ベストアンサー1

簡単な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

入力ファイルで必要な情報を見つけたら、簡単に解析し、行の先頭でを押すと}収集された情報が正しい形式で出力されます。

テキストの解析は、テキストに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
}

(パスワードの先頭にスペースが4つあることに注意してください。)これを行うと、次のような結果が得られます。

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 }

おすすめ記事