Ввод вывод скрипта в файл XML

<property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value>2</value>
  <description>The maximum number of map tasks that will be run
  simultaneously by a task tracker.
  </description>
</property>

<property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
  <value>2</value>
  <description>The maximum number of reduce tasks that will be run
  simultaneously by a task tracker.
  </description>
</property>

Я хочу изменить только (mapred.tasktracker для.карта.задачи.maximum value )по моему значению моего вывода скрипта ,и не изменяйте другое значение(максимальное количество задач reduce) за его пределами , как я могу это сделать?!

14
задан Hannu
21.05.2023 1:52 Количество просмотров материала 2973
Распечатать страницу

2 ответа

прежде всего ваш XML файл кажется не полным, в нем отсутствует что-то вроде

<?xml version="1.0"?>
<top>
...
</top>

если вы добавите, что вы можете использовать xmlstarlet для изменения XML-файла.

xmlstarlet ed -P -u "/top/property/name[text()='mapred.tasktracker.map.tasks.maximum']/../value" -v 4 nameofxmlfile

для информации, что это можно man xmlstarlet и xmlstarlet ed --help.

xmlstarlet будет работать в режиме редактирования (ed), он загрузит файл nameofxmlfile, сохранять пробелы (-P) и это изменит значение узла на 4 (-v 4). Узел для изменения определяется XPath "/top/property/name[text()='mapred.tasktracker.map.tasks.maximum']/../value". Это должно быть прочитано слева направо: начните с верхнего уровня (/), в top узел, в каждой property подузел, перейти в name Sub узел, фильтр только для этих имен, которые имеют данный текст ([text()='mapred.tasktracker.map.tasks.maximum']), подняться на один узел (.., снова в собственность), затем спускаемся в value подузла.

результат будет напечатано в stdout. Если вы хотите, чтобы xmlstarlet изменил файл, добавьте -L после -P.

0
отвечен Werner Henze 2023-05-22 09:40

1. Использовать XML-парсер

если вы собираетесь манипулировать XML, вы должны использовать инструмент, разработанный специально для этой цели.  (В Unix такие инструменты не встроены.)  Это неоднократно обсуждалось на Stack Exchange:

XMLStarlet (which Вернер Хенце упоминается), как представляется, широко рекомендуется.

2. Однако ...

... если ваши данные хорошо себя вели (например, одна пара совпадающих тегов в строке; нет строк, которые выглядят как теги, но не; и т. д…), вы сможете сделать это с помощью стандартных команд Unix.

2.1 awk

awk '
        /<name>mapred.tasktracker.map.tasks.maximum<\/name>/ { inzone=1 }
        inzone && /<value>.*<\/value>/ { sub(/<value>.*<\/value>/, "<value>4</value>"); inzone=0 }
        /<\/property>/ { inzone=0 }
        1
    '
  • узнав mapred.tasktracker.map.tasks.maximum строка, установите inzone флаг чтобы указать, что мы хотим изменить следующим value мы видим.
  • если мы видим value пока мы в зоне (inzone), замените его новым значением и обнулите inzone флаг.
  • если мы видим конец property снимите флаг, потому что мы больше не в mapred.tasktracker.map.tasks.maximum данные.

2.2 sed

sed '/<name>mapred.tasktracker.map.tasks.maximum<\/name>/ {
        : loop
        n
        s/<value>.*<\/value>/<value>4<\/value>/
        t
        /<\/property>/b
        b loop
    }'
  • узнав mapred.tasktracker.map.tasks.maximum строка, введите {…} командный блок.
  • начните блок с метки (loop), таким образом, мы можем выполнить следующие команды несколько раз (пока мы не найдем value).
  • перейти к следующей строке.
  • попробуйте подставить значение.
  • если замена прошла успешно, перейдите к концу цикла.
  • если мы видим конец property филиала к концу цикла, потому что мы больше не в mapred.tasktracker.map.tasks.maximum данные.
  • в противном случае, ответвление к началу цикла, и повторите выше.
0
отвечен Scott 2023-05-22 11:57

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх