文字列に二重引用符が含まれていると、Sedが置換に失敗する

文字列に二重引用符が含まれていると、Sedが置換に失敗する

sed コマンド出力エラーの実行中:

sed: -e expression #1, char 14: unterminated `s' command

実行するコマンドファイルは次のとおりです。

#!/bin/sh

old_version='\"version\": \"0.0.0\"'

year=$(date +%y)
dayOfYear=$(date +%j)

version=$year'.'$dayOfYear'.''3434'
echo $version

filepath="/opt/vsts-agent-linux/_work/5/s/projects/tl-angular-map/package.json"

echo $filepath

replace="s/"$old_version"/"$version"/g"

echo $replace

sed -i -e $replace $filepath

問題は、接続を介して作成した文字列が二重引用符で正しく閉じられないことです。

ベストアンサー1

versionこれがJSONドキュメントの最上位キーであると仮定すると、jq使用したい値で次のように更新できます。

jq --arg patch 3434 \
   '.version |= (now | strftime("%y.%j.") + $patch)' file.json >newfile.json

まず、コマンドラインの内部変数を$patchパッチリリースバージョンに設定します。次に、現在時刻を使用してタイムスタンプ文字列をフォーマットし、文字列の末尾にstrftime()on値を追加します。$patchその後、結果文字列がversionJSON文書の最上位レベルのキーに割り当てられ、結果文書が出力されます。

例:

$ cat file.json
{
  "key": "value",
  "version": "0.0.0",
  "foo": "bar"
}
$ jq --arg patch 3434 '.version |= (now | strftime("%y.%j.") + $patch)' file.json
{
  "key": "value",
  "version": "21.292.3434",
  "foo": "bar"
}

以前のバージョンであることを確認する必要があります。いいえ完全に更新されていない場合は、代わり0.0.0に使用してください。

jq --arg patch 3434 \
    'select(.version == "0.0.0").version |= (now | strftime("%y.%j.") + $patch)' file.json >newfile.json

つまり、オブジェクトselect()の値がある場合にのみオブジェクトがversion更新されるようにするために使用されます0.0.0

何人かの人々にとってより良く見えるかもしれないもう一つの表現方法は次のとおりです。

jq --arg patch 3434 \
    '(now | strftime("%y.%j.") + $patch) as $version |
    select(.version == "0.0.0").version |= $version' file.json >newfile.json

おすすめ記事