Sed не может заменить, если строка содержит двойные кавычки

Лучший известный мне способ — использовать сценарий входа в систему PAM, который я адаптировал из предыдущей работы, поскольку не смог найти удовлетворительного ответа на этот вопрос.

Ваша парольная фраза хранится в зашифрованном виде с помощью системного пароля и сложной функции деривации. При входе в систему ваш системный пароль используется для расшифровки парольной фразы и ее добавления в агент.

https://github.com/capocasa/systemd-user-pam-ssh

Преимущество по сравнению с любым другим представленным решением заключается в том, что оно сочетает в себе безопасность, эквивалентную запуску ssh -add вручную при загрузке без каких-либо усилий. Он не требует дополнительных инструментов и имеет одну дополнительную зависимость, которая уже установлена ​​по умолчанию в большинстве систем (OpenSSL ).

0
19.10.2021, 15:04
2 ответа

Добавление буквенных кавычек в строки не означает, что оболочка понимает эти кавычки. Вам нужна эта заметка (, в bash версии 4.2+ printf можно использовать для форматирования даты)

old_version='"version": "0.0.0"'

# "-1" is a magic value meaning "now"
printf -v year '%(%y)T' -1
printf -v dayOfYear '$(%j)T' -1

version="$year.$dayOfYear.3434"
echo "$version"
# or even without the temp variables:
# printf -v version '%(%y)T.%(%j)T.3434' -1 -1

filepath="/opt/vsts-agent-linux/_work/5/s/projects/tl-angular-map/package.json"
echo "$filepath"

replace="s/$old_version/$version/g"
echo "$replace"

sed -i -e "$replace" "$filepath"

Однако при этом строка "version": "0.0.0"будет заменена на 21.292.3434, что приведет к поломке вашего объекта JSON в файле.

$ cat package.json
{
  "key": "value",
  "version": "0.0.0",
  "foo": "bar"
}

$ sed "s/$old_version/$version/g" package.json
{
  "key": "value",
  21.292.3434,
  "foo": "bar"
}

Для управления данными JSON следует использовать для установки нового значения:

$ jq --arg newversion "$version" '.version = $newversion' package.json
{
  "key": "value",
  "version": "21.292.3434",
  "foo": "bar"
}
0
19.10.2021, 16:19

Предполагая, что versionявляется ключом верхнего уровня -в вашем документе JSON, вы должны обновить его до нужного значения, используя jq, например:

jq --arg patch 3434 \
   '.version |= (now | strftime("%y.%j.") + $patch)' file.json >newfile.json

Это сначала устанавливает внутреннюю переменную $patchв версию выпуска исправления в командной строке. Затем он форматирует строку отметки времени -из текущего времени, используя strftime(), и добавляет значение $patchв конец этой строки. Эта результирующая строка затем назначается клавише versionна верхнем уровне -документа JSON, и результирующий документ выводится.

Пример:

$ cat file.json
{
  "key": "value",
  "version": "0.0.0",
  "foo": "bar"
}
$ jq --arg patch 3434 '.version |= (now | strftime("%y.%j.") + $patch)' file.json
{
  "key": "value",
  "version": "21.292.3434",
  "foo": "bar"
}

Нужно ли вам убедиться, что старая версия не обновлена, если она отличается от точно 0.0.0, тогда вместо этого используйте

jq --arg patch 3434 \
    'select(.version == "0.0.0").version |= (now | strftime("%y.%j.") + $patch)' file.json >newfile.json

То есть используйте select(), чтобы убедиться, что объект всегда обновляется, только если его значение versionравно 0.0.0.

Альтернативный способ формулировки, который может кому-то показаться более приятным:

jq --arg patch 3434 \
    '(now | strftime("%y.%j.") + $patch) as $version |
    select(.version == "0.0.0").version |= $version' file.json >newfile.json
1
19.10.2021, 16:30

Теги

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