コロンと括弧の間の2番目の項目を置き換える

コロンと括弧の間の2番目の項目を置き換える

コロンの後のすべての文字列を、次のように同じ単語+下線+数字に置き換える必要があります。

{"first": "1_first", "second": "1_second"}

予想される結果:

{"first": "first_1", "second": "second_1"}
{"first": "first_20", "second": "second_20"}
{"first": "first_33", "second": "second_33"}

最初の作業が正常に完了しました。

echo '{"first": "first_1", "second": "second_1"}' | sed "s/\( \".*\",\)/ \"first_$j\",/"

結果:

{"first": "first_888", "second": "second_1"}

しかし、2番目には問題があります。私の考えでは、この表現はあまりに欲張りなようです。

echo '{"first": "first_1", "second": "second_1"}'|sed "s/\( \".*\)\"}/ \"second_$j\"}/"

この文章はあまりにも削除されました。

{"first": "second_888"}

たぶんこれを行うためのよりエレガントな方法がありますか? 2つの代わりに1つの式を使用しますか?

答え1

値をキーの文字列に置き換えると、これが必要なものかどうかはわかりません。キーまたは値に(エスケープされた)引用符がない限り機能します。これを行う場合は、可能であれば実際のパーサーを使用する方がよいでしょう。

$ num=42
$ echo '{"foo": "xxx", "bar": "yyy"}' | \
  sed -E 's/"([^"]*)": "[^"]*"/"\1": "\1_'$num'"/g'
{"foo": "foo_42", "bar": "bar_42"}

答え2

使用jq:

$ cat data.json
{"first": "xxx", "second": "xxx"}
{"first": "yyy", "second": "yyy"}
{"first": "zzz", "second": "zzz"}

$ jq 'with_entries(.value = .key + "_42")' data.json
{
  "first": "first_42",
  "second": "second_42"
}
{
  "first": "first_42",
  "second": "second_42"
}
{
  "first": "first_42",
  "second": "second_42"
}

シェル変数を使用してください。

$ number=9
$ jq 'with_entries(.value = .key + "_'$number'")' data.json
{
  "first": "first_9",
  "second": "second_9"
}
{
  "first": "first_9",
  "second": "second_9"
}
{
  "first": "first_9",
  "second": "second_9"
}

コンパクトな出力を好む場合:

$ jq -c 'with_entries(.value = .key + "_'$number'")' data.json
{"first":"first_9","second":"second_9"}
{"first":"first_9","second":"second_9"}
{"first":"first_9","second":"second_9"}

関連情報