sedパラメーターは、複数行の引用符で囲まれた文字列に置き換えられました。

sedパラメーターは、複数行の引用符で囲まれた文字列に置き換えられました。

ターゲット

テキストを"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には改行で区切られたレコードは含まれておらず、sedJSONの引用符と文字エンコード規則を理解していません。これらの構造化データセット(またはXML、YAML、または場合によってはCSV)を正しく解析して変更するには、適切なパーサーを使用する必要があります。

この例では、追加ボーナスでjq次のコードを取得できます。簡単に必要に応じて変更し、入力データ構造への変更をサポートするように簡単に変更することもできます。

おすすめ記事