ターゲット
テキストを"scripts: {"
次の文字列に置き換えます。
"scripts": {
"watch": "tsc -w",
ファイルからjson
。
努力する
ソース文字列とターゲット文字列に対して2つの変数を作成しました。
最初の試み
SRC='"scripts": {'
DST='"scripts": {
"watch": "tsc -w",'
そして、次のコマンドを実行してください。
sed "s/$SRC/$DST/" foo.json
これは失敗しました。
2回目の試み
今回は、ソースとターゲットの文字列の二重引用符をエスケープしました。
SRC="\"scripts\": {"
DST="\"scripts\": {
\"watch\": \"tsc -w\",
\"dev\": \"nodemon dist/index.js\","
上記と同じコマンドを実行しましたが失敗しました。
3回目と4回目の試み
以下を使用して上記で定義された変数を試しました。
sed 's/'"$SRC"'/'"$DST"'/' foo.json
これは失敗しました。
これらすべての試みでエラーが発生しました。
unterminated 's' command
何が間違っていますか?
ベストアンサー1
JSONドキュメントが次のようになっているとします。
{
"scripts": {
"other-key": "some value"
}
}
...このオブジェクトに別のキーと値のペアを挿入しようとしています.scripts
。その後、次のものを使用できますjq
。
$ jq '.scripts.watch |= "tsc -w"' file.json
{
"scripts": {
"other-key": "some value",
"watch": "tsc -w"
}
}
または、
$ jq '.scripts += { watch: "tsc -w" }' file.json
{
"scripts": {
"other-key": "some value",
"watch": "tsc -w"
}
}
両方する変えるすでに存在する.scripts.watch
アイテムです。
キーと値のペアの順序は.scripts
重要ではありません(配列ではないため)。
出力を保存するには、新しいファイルにリダイレクトします。
同じオブジェクトに複数のKey-Valueペアを追加します。
$ jq '.scripts += { watch: "tsc -w", dev: "nodemon dist/index.js" }' file.json
{
"scripts": {
"other-key": "some value",
"watch": "tsc -w",
"dev": "nodemon dist/index.js"
}
}
jo
オブジェクトに追加する必要があるJSONを作成するために結合されました.scripts
。
$ jq --argjson new "$( jo watch='tsc -w' dev='nodemon dist/index.js' )" '.scripts += $new' file.json
{
"scripts": {
"other-key": "some value",
"watch": "tsc -w",
"dev": "nodemon dist/index.js"
}
}
sed
行中心のテキストを解析するのに適しています。 JSONには改行で区切られたレコードは含まれておらず、sed
JSONの引用符と文字エンコード規則を理解していません。これらの構造化データセット(またはXML、YAML、または場合によってはCSV)を正しく解析して変更するには、適切なパーサーを使用する必要があります。
この例では、追加ボーナスでjq
次のコードを取得できます。簡単に必要に応じて変更し、入力データ構造への変更をサポートするように簡単に変更することもできます。