このプロジェクトには作曲家.jsonを使用する何百ものアプリケーションがあります。私はBashスクリプトを使用して、新しいバージョンを受け取るアプリケーションを含むファイルのバージョン番号を確認して更新しています。
たとえば、元のファイルは次のようになります(該当する部分のみを入れました)。
{
"name" : "test/graylogger"
"version" : "1.1.1"
...
"require": {
"test/phpunit": "4.8.23"
}
次のように更新したいと思います。
{
"name" : "test/graylogger"
"version" : "1.1.2"
...
"require": {
"test/phpunit": "4.8.24"
}
しかし、結果は次のようになります(私は望んでいません)。
{
"name" : "1.1.2"
"version" : "1.1.2"
...
"require": {
"test/phpunit": "4.8.24"
}
デフォルトでは、私のスクリプトは「バージョン」を検索し、その後の2番目の引用符を1つずつ更新し、フォルダファイル名(この場合は「graylogger」)に基づいて繰り返し、次にアプリケーションフォルダを含む他の項目に基づいて繰り返しします。しかし、何らかの理由で名前が更新されますが、これは私が望んでいません。これを行うために使用するコードスニペットは次のとおりです。
while read line2; do
line1="$line1\"" #I did this to prevent any repetitive names from upping twice
original=$(grep -hr "$line1" /Websites/"$line2"/composer.json | awk -F \" '{print $4}')
if [["$original" != *"$line1"*]]; then
sed -i'' s,"$original","$version",g composer.json
done < websites.txt
line1
ファイルで更新されるアプリケーションです。
line2
更新されるファイルです。
2番目のテキストのテキストにアプリ名が含まれていて更新されない場合は、変更を除外するifステートメントを作成してみましたが、うまくいかないようです。
これはMacで行われます。
ありがとうございます!
答え1
jq
コマンドラインでJSONを処理するためのツールです。、デフォルトのテキスト修正よりも構造化データを処理するのに適しています。以下は、実際にやりたいことと一致しているように見えるいくつかのjqです。
program=test/graylogger
version=1.1.2
jq --arg prog "$program" --arg version "$version" '
(.. | select(.name? == $prog).version) = $version
| (.. | select(has($prog)?)[$prog]) = $version' composer.json | sponge composer.json
jqプログラム自体は、一重引用符で囲まれた2行で構成されています。
それは取り替える両方"名前付き" test/graylogger オブジェクトの "version" プロパティ (2 行目は test/graylogger jqjq
プログラムで始まります。) and the
property of any object that has one (the second line of the
program) with the new version. You can edit to only one or the other as appropriate - the pipe
最初の行は、次を使用して適切なオブジェクトを見つける方法で機能します..|select(.name? == $prog)
。すべて値()を入力して、私たちが探しているオブジェクト(まったくない)..
だけを見続けてから、そのオブジェクトにバージョンプロパティ()を設定します。name
name
.version = $version
has
2行目も同様に、キーがプログラム名と一致するオブジェクトを選択し、インデックスを使用してその[]
プロパティを更新します。
使ったsponge
moreutilsからsed -i
ファイルの上書き動作を所定の位置にコピーします。代わりに一時ファイルを使用できます。これらはすべて既存のループ構造に入力され、すべてのファイルに適用できます。