最後の中かっこの前に新しい行を挿入したいです。私のテキストファイルは次のとおりです
"accounts": {
"0x0000000000000000000000000000000000000008": { "builtin": { "name": "alt_bn128_pairing", "activate_at": "0x0", "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } },
"0x00Ea169ce7e0992960D3BdE6F5D539C955316432": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
}
だから私がしたいのは、account
sedスクリプトを介して新しいものを追加することです。
新しいアカウントは、次の変数を使用して指定されます。
"$ACCOUNT_ADDR": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
答え1
sed
操作に誤ったツールです。正しいツールの1つですjq
。
% 猫 wibble.json { 「アカウント」:{ "0x000000000000000000000000000000000000008":{"buildin":{"name":"alt_bn128_pairing", "active_at":"0x0", "価格":{"alt_bn12_0 000 0} } } }, "0x00Ea169ce7e0992960D3BdE6F5D539C955316432": {"バランス": "1606938044258990275541962092341162602522202933" } } %ACCOUNT_ADDR="0xdeadbeeffeefdface0badd00dcacad0d0eeeeeeee" %jq'."Account"."'"${ACCOUNT_ADDR}"'"."Balance"="42"' wibble.json { 「アカウント」:{ "0x000000000000000000000000000000000000000008": { 「組み込み」:{ "名前": "alt_bn128_pairing", "activate_at": "0x0", 「価格」:{ "alt_bn128_pairing": { 「基本」:100000、 「右」:80000 } } } }, "0x00Ea169ce7e0992960D3BdE6F5D539C955316432":{ "バランス": "1606938044258990275541962092341162602522202993782792835301376" }, "0xdeadbeeffeefdface0badd00dcacad0d0eeeeeeee": { 「バランス」:「42」 } } } %
また、囲むオブジェクトなしでキーと値のペアがあるという事実も発見しました。 ☺
答え2
「アカウント」が表示されたら、1行を追加できます。
sed "/accounts/ a\
\"$ACCOUNT_ADDR\": { \"balance\": \"1606938044258990275541962092341162602522202993782792835301376i\" }
" file
("
脱出、変数挿入)
sed "s/^ }$/ \"$ACCOUNT_ADDR\": { \"balance\": \"1606938044258990275541962092341162602522202993782792835301376i\" }\n }/g" file
行を置き換えて}
2行を印刷します。
sed -i ...
変更したファイルを繰り返します。
$ cat file
"accounts": {
"0x0000000000000000000000000000000000000008": { "builtin": { "name": "alt_bn128_pairing", "activate_at": "0x0", "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } },
"0x00Ea169ce7e0992960D3BdE6F5D539C955316432": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
}
$ cat script.sh
#!/bin/bash
for i in $(seq 1 5); do
ACCOUNT_ADDR="account_"$i
sed -i "/accounts/ a\
\"$ACCOUNT_ADDR\": { \"balance\": \"1606938044258990275541962092341162602522202993782792835301376i\" }
" file
done
$ ./script.sh
$ cat file
"accounts": {
"account_5": { "balance": "1606938044258990275541962092341162602522202993782792835301376i" }
"account_4": { "balance": "1606938044258990275541962092341162602522202993782792835301376i" }
"account_3": { "balance": "1606938044258990275541962092341162602522202993782792835301376i" }
"account_2": { "balance": "1606938044258990275541962092341162602522202993782792835301376i" }
"account_1": { "balance": "1606938044258990275541962092341162602522202993782792835301376i" }
"0x0000000000000000000000000000000000000008": { "builtin": { "name": "alt_bn128_pairing", "activate_at": "0x0", "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } },
"0x00Ea169ce7e0992960D3BdE6F5D539C955316432": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
}
答え3
私は時々sedチャレンジが好きです:使用ACCOUNT_ADDR=1234
:
sed -n -e '
x
$ i\
"'"$ACCOUNT_ADDR"'": {"balance":0},
2,$ p
$ { x; p }
' file
"accounts": {
"0x0000000000000000000000000000000000000008": { "builtin": { "name": "alt_bn128_pairing", "activate_at": "0x0", "pricing": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 } } } },
"1234": {"balance":0},
"0x00Ea169ce7e0992960D3BdE6F5D539C955316432": { "balance": "1606938044258990275541962092341162602522202993782792835301376" }
}
これはx
現在の行を予約済みスペースに保存し、次のサイクルで「前」行になるように使用します。
他の場所で述べたように、sed -i
編集内容を所定の場所に保存するには
ファイルを元に戻して、より単純なsedコマンドを使用して同じ結果を得ることができます。
temp=$(mktemp)
tac file | sed '2a\
"'"$ACCOUNT_ADDR"'": {"balance":0},
' | tac > "$temp" && mv "$temp" file