Изменить значение узла XML с помощью sed?

Нет, нет.

Здесь есть три набора «переменных».

  • Оболочка Bourne Again наследует набор переменных среды от родительского процесса, разветвившего и выполнившего ее. Они остаются переменными среды процесса оболочки Bourne Again на протяжении всего его жизненного цикла.
  • Эти переменные среды инициализируют второй набор, переменные оболочки , которые оболочка Bourne Again позволяет пользователям видеть и управлять ими с помощью таких команд, как declare.
  • Этот второй набор переменных оболочки определяет, с помощью которых переменные оболочки помечены как экспортируемые(наряду с парой других механизмов, выходящих за рамки этого ответа ), какие переменные среды разветвлены дочерними процессами. самой оболочкой Bourne Again наследуются после execveдля запуска внешней команды в этом дочернем процессе.

Первый набор — это «переменные среды текущей оболочки». Второй набор — это переменные оболочки , а третий набор — это переменные окружения дочернего процесса .

Хотя оболочка Bourne Again может изменить свои переменные среды процесса и сделать это изменение видимым для других процессов, как я объяснял в https://unix.stackexchange.com/a/432681/5132, на практике оболочка Bourne Again этого не делает.

Точно так же оболочка Bourne Again может предоставлять доступ к своим переменным среды, но это не так, а только предоставление доступа к переменным оболочки , производным от этих переменных среды. при запуске программы-оболочки.

(Я упомянул оболочку Bourne Again из-за вопроса, но на самом деле большинство оболочек ведут себя аналогично, и на самом деле это не относится к оболочке Bourne Again.)

И, конечно же, внешние программы, такие как envи printenv, отображают третий набор переменных.

Чтобы увидеть переменные среды текущего процесса оболочки, нужно использовать внешнюю команду:

ps ewwww -p $$

или

hexdump -C /compat/linux/proc/$$/environ

(просто /procв операционных системах Linux )

Дополнительная литература

1
15.03.2019, 16:28
2 ответа

Для этого можно использовать анализатор XML. Напримерxmlstarlet(XML-инструмент командной строки):

$ xmlstarlet ed -u '//client-version' -v '1.2.9' file.xml
<?xml version="1.0"?>
<client-version>1.2.9</client-version>

Приведенная выше команда найдет все вхождения узла документа client-versionи изменит их значения на строку 1.2.9.

Чтобы изменить только те, что 1.2.8, вы должны использовать

xmlstarlet ed -u '//client-version[text() = "1.2.8"]' -v '1.2.9' file.xml

Перенаправьте вывод в новый файл, проверьте его и переименуйте в исходное имя файла или запустите xmlstarletс параметрами -Lили --inplace, чтобы отредактировать файл в месте -.


Использование xq, из yq, из https://kislyuk.github.io/yq/, что позволяет использовать jqвыражения для изменения XML-документов:

xq -x '(..|."client-version"? // empty) |= "1.2.9"' file.xml

Это обновляет значение каждого узла client-versionна 1.2.9независимо от того, где в документе он расположен.

Строка 1.2.9может быть вставлена ​​из такой переменной:

new_version=1.2.9
xq -x --arg ver "$new_version" '(..|."client-version"? // empty) |= $ver' file.xml
7
28.04.2021, 23:36

Пробовал с командой awk ниже, все работает нормально

awk '$0 ~ /^<client-version>/ && $0 ~ /<\/client-version>/{gsub("1.2.8","1.2.9",$0)}1' orginalfile  >temperorayfile && mv temperorayfile  orginalfile 
0
28.04.2021, 23:36

Теги

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