Bash - Как обновить содержимое кавычек, но только если это число?

Просто поместите команду (без sudo) в исполняемый скрипт /etc/rc.local или /etc/rc.d/rc.local.

1
15.04.2019, 17:48
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 представляет собой две строки в одинарных кавычках.

Он заменит оба свойство «версия» любого объекта, чье «имя» — test/graylogger (первую строку jqпрограммы ) and thetest/graylogger property of any object that has one (the second line of thejq 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перезаписи файла в -месте. Вместо этого вы можете использовать временный файл. Все это может быть внутри любой существующей структуры цикла, которая будет применяться ко всем вашим файлам.

1
27.01.2020, 23:41

Теги

Похожие вопросы