[Другой подход jq] Если вы используете jq , это буквально одна строка!
cat input.json | jq -r '.["items"] | map(select(.name | contains("first-block"))) |.[].hostRef.hostId'
П.С.
Команды jq говорят сами за себя, поэтому я не пытаюсь их объяснить, если кто-то столкнется с трудностями, дайте мне знать в комментариях, я объясню!
JSON, указанный в вопросе, неполный!
Мне не удалось заставить работать команду sed. Однако я нашел способ запустить скрипт Python внутри bash, который сделал эту работу за меня. Если кому интересно:
export new_path="/Users/user/.local/share/virtualenvs/venv-Qxxxxx9/bin/python"
python3 - << EOF
import json
import os
with open('settings.json', mode='r+') as file:
data = json.load(file)
data['python.defaultInterpreterPath'] = os.environ['new_path']
data['python.pythonPath'] = os.environ['new_path']
file.seek(0)
json.dump(data, file, indent=4, sort_keys=True)
file.truncate()
EOF
echo 'continue bash'
Это должно быть похоже на то, что вы уже пробовали, но не рекомендуется редактировать файлы json таким образом, лучше использовать jq
, как уже было предложено.
sed -i 's/""/"\/Users\/user\/.local\/share\/virtualenvs\/venv-Qxxxxxx9\/bin\/python"/g' settings.json
Вывод должен быть следующим:
{
...
"python.pythonPath": "/Users/user/.local/share/virtualenvs/venv-Qxxxxxx9/bin/python",
"python.defaultInterpreterPath": "/Users/user/.local/share/virtualenvs/venv-Qxxxxxx9/bin/python".
...
}
Вместо этого я бы сделал это в awk
, что упрощает применение замены только в том случае, если значение равно""
и ключ является одним из двух желаемых:
$ awk -F: -vOFS=" : " '
$1=="\"python.pythonPath\"" ||
$1=="\"python.defaultInterpreterPath\""{
$2="\"/Users/user/.local/share/virtualenvs/venv-Qxxxxx9/bin/python\","}
1;
' file
{
...
"python.pythonPath" "/Users/user/.local/share/virtualenvs/venv-Qxxxxx9/bin/python"
"python.defaultInterpreterPath" "/Users/user/.local/share/virtualenvs/venv-Qxxxxx9/bin/python"
...
}