Просто поместите команду (без sudo
) в исполняемый скрипт /etc/rc.local
или /etc/rc.d/rc.local
.
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 представляет собой две строки в одинарных кавычках.
Он заменит оба свойство «версия» любого объекта, чье «имя» — test/graylogger (первую строку jq
программы ) and the
test/graylogger property of any object that has one (the second line of the
jq 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
ключ которого соответствует имени программы, а затем обновляет это свойство с помощью []
индексации.
Я использовалsponge
из moreutils , чтобы воспроизвести поведение sed -i
перезаписи файла в -месте. Вместо этого вы можете использовать временный файл. Все это может быть внутри любой существующей структуры цикла, которая будет применяться ко всем вашим файлам.