Это часть моего файла package.json
{
"name": "org-team-module",
"version": "1.1.0-snapshot",
"description": "Some description",
"scripts": {
"start": "npm run build && npm run copy-static-assets && npm run serve",
"build": "rimraf dist && npx tsc && echo npm run lint",
Я хочу заменить версию на определенное значение, скажем, 1.2.0-snapshot
Это то, что у меня есть до сих пор;
sed -nE -i 's/(^\s*"version": ")(.*?)(",$)/\11.2.0-snapshot\3/p' test.json
Однако, когда я добавляю флаг -i для замены; весь файл заменяется искомым значением. то есть все содержимое файла после замены
"version": "1.2.0-snapshot",
Как я могу просто заменить эту конкретную строку в файле
sed
не подходит для работы с файлами JSON; ваш скрипт завершится ошибкой, если "version"
и его значение не находятся в одной строке (не обычная ситуация, но определенно допустимый JSON). Вместо этого я предлагаю использовать jq. Он знает, как анализировать и генерировать JSON, и скрипт становится меньше и понятнее.
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
Я бы предложил просто изменить аргументы на
-E -i
и удалить/p
, например.sed -E -i 's/(^\s*"version": ")(.*?)(",$)/\11.2.0-snapshot\3/' test.json