#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