次の形式の文字列があります。
"User-Password":"aaaa","Calling-Station-Id":"bbbb","Eltex-AVPair":"cccc","h323-call-type":"dddd","Framed-IP-Address":"eeee","NAS-IP-Address":"ffff","Cisco-AVPair":["xpgk-request-type=gggg","xpgk-src-number-in=hhhh","xpgk-dst-number-in=iiii","xpgk-src-number-out=jjjj","xpgk-dst-number-out=kkkk","h323-gw-address=llll"],"Acct-Session-Id":"mmmm","User-Name":"nnnn","Called-Station-Id":"oooo","h323-gw-id":"pppp","Event-Timestamp":"qqqq","h323-conf-id":"rrrr","h323-call-origin":"ssss","NAS-Port-Type":"tttt","NAS-Port":"uuuu"
に変換する必要があります
User-Password = "aaaa"
Calling-Station-Id = "bbbb"
Eltex-AVPair = "cccc"
h323-call-type = "dddd"
Framed-IP-Address = "eeee"
NAS-IP-Address = "ffff"
Cisco-AVPair = "xpgk-request-type=gggg"
Cisco-AVPair = "xpgk-src-number-in=hhhh"
Cisco-AVPair = "xpgk-dst-number-in=iiii"
Cisco-AVPair = "xpgk-src-number-out=jjjj"
Cisco-AVPair = "xpgk-dst-number-out=kkkk"
Cisco-AVPair = "h323-gw-address=llll"
Acct-Session-Id = "mmmm"
User-Name = "nnnn"
Called-Station-Id = "oooo"
h323-gw-id = "pppp"
Event-Timestamp = "qqqq"
h323-conf-id = "rrrr"
h323-call-origin = "ssss"
NAS-Port-Type = "tttt"
NAS-Port = "uuuu"
vimを使用してください。
だからこうする必要があります
:s/\,/\r/g|:s/^\"//g|(something_for_copying_Cisco-AVPair)|:s/\"\:/\ \=\ /g
これは4つの部分に分かれています。
- を\rに変換
- 削除^"
- Cisco-AVPair をコピーし、角かっこを削除します。
- '":'を '='に変換
この代替項目の最初と最後の部分だけを書き込むことができます。他の人とどのように過ごすべきですか?
答え1
一連の検索/代替を実行できます。
:%s/,/\r/g
:%s/^"
:v/:/s/^/Cisco-AVPair":"
:%s/\v":\[?"/ \= "
これは次のように翻訳されます。
,
それぞれを改行文字に置き換えます。- すべての先行引用符を削除
- 行の開始を置き換えるいいえ
:
以下を含みますCisco-AVPair":"
- すべて
":["
次へ交換= "
答え2
このタスクのための次の解決策が見つかりました。
echo '' | jq -r 'paths(scalars) as $p|[([$p[]|tostring ]|join(".->.") ),(getpath($p)|tojson)]|join(" = ")'|grep '^RAD_REQUEST\.\-'|sed -r 's/^[A-Z_]+\.\->\.//'|sed -r 's/\.\->\.[0-9]+//'
機能するには、引用符の間に要求を入力する必要があります。
答え3
JSONドキュメント(問題を解決するために修正され、もはや有効なJSONドキュメントではない)をTOMLに変換するようです。表示されるTOMLは次のとおりです。かなり重複したキーが含まれているため有効です。
元のJSONオブジェクトが次のようになっているとします。
{
"User-Password": "aaaa",
"Calling-Station-Id": "bbbb",
"Eltex-AVPair": "cccc",
"h323-call-type": "dddd",
"Framed-IP-Address": "eeee",
"NAS-IP-Address": "ffff",
"Cisco-AVPair": [
"xpgk-request-type=gggg",
"xpgk-src-number-in=hhhh",
"xpgk-dst-number-in=iiii",
"xpgk-src-number-out=jjjj",
"xpgk-dst-number-out=kkkk",
"h323-gw-address=llll"
],
"Acct-Session-Id": "mmmm",
"User-Name": "nnnn",
"Called-Station-Id": "oooo",
"h323-gw-id": "pppp",
"Event-Timestamp": "qqqq",
"h323-conf-id": "rrrr",
"h323-call-origin": "ssss",
"NAS-Port-Type": "tttt",
"NAS-Port": "uuuu"
}
yq
次のようなさまざまなツールを使用してTOMLに変換できます。https://kislyuk.github.io/yq/またはyj
https://github.com/sclevine/yj。
そしてyq
、
yq -t . file
またはyj
、
yj -jt <file
どちらの場合も、結果のTOML文書は次のとおりです。
User-Password = "aaaa"
Calling-Station-Id = "bbbb"
Eltex-AVPair = "cccc"
h323-call-type = "dddd"
Framed-IP-Address = "eeee"
NAS-IP-Address = "ffff"
Cisco-AVPair = [ "xpgk-request-type=gggg", "xpgk-src-number-in=hhhh", "xpgk-dst-number-in=iiii", "xpgk-src-number-out=jjjj", "xpgk-dst-number-out=kkkk", "h323-gw-address=llll",]
Acct-Session-Id = "mmmm"
User-Name = "nnnn"
Called-Station-Id = "oooo"
h323-gw-id = "pppp"
Event-Timestamp = "qqqq"
h323-conf-id = "rrrr"
h323-call-origin = "ssss"
NAS-Port-Type = "tttt"
NAS-Port = "uuuu"