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
その後、結果文字列がversion
JSON文書の最上位レベルのキーに割り当てられ、結果文書が出力されます。
例:
$ 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