используйте sed для замены номера версии в файле package.json

#json #sed

#json #sed

Вопрос:

Это часть моего файла package.json

 {
    "name": "org-team-module",
    "version": "1.1.0-snapshot",
    "description": "Some description",
    "scripts": {
        "start": "npm run build amp;amp; npm run copy-static-assets amp;amp; npm run serve",
        "build": "rimraf dist amp;amp; npx tsc amp;amp; echo npm run lint",
 

Я хочу заменить версию определенным значением, скажем, 1.2.0-snapshot

Это то, что у меня есть до сих пор;

 sed -nE -i 's/(^s*"version": ")(.*?)(",$)/11.2.0-snapshot3/p' test.json
 

Однако, когда я добавляю флаг -i для замены; весь файл заменяется искомым значением.
т.Е. Все содержимое файла после замены

         "version": "1.2.0-snapshot",
 

Как я могу просто заменить эту конкретную строку в файле

Комментарии:

1. Я бы предложил просто изменить аргументы на -E -i и удалить /p , например sed -E -i 's/(^s*"version": ")(.*?)(",$)/11.2.0-snapshot3/' test.json

2. sed не подходит для работы с файлами JSON; ваш скрипт завершится с ошибкой, если "version" и его значение не находятся в одной строке (не обычная ситуация, но определенно допустимый JSON). Я предлагаю использовать jq вместо этого. Он знает, как анализировать и генерировать JSON, и сценарий становится меньше и понятнее.

Ответ №1:

sed не подходит для работы с файлами JSON; ваш скрипт завершится с ошибкой, если "version" и его значение не находятся в одной строке (не обычная ситуация, но определенно допустимый JSON).

Я предлагаю использовать jq вместо этого. Он знает, как анализировать и генерировать JSON, и сценарий становится меньше и понятнее.

Заменить значение version на фиксированное значение так же просто, как:

 jq '.version="1.2.0-snapshot"' package.json
 

Он не изменяет исходный файл, но выводит измененный JSON на экран. Ваш скрипт может перенаправить свои выходные данные во временный файл, а затем переместить временный файл поверх исходного файла, например:

 jq '.version="1.2.0-snapshot"' package.json > /tmp/package.json
mv /tmp/package.json package.json