Введіть вихід скрипта оболонки у файл Xml


-1
<власність>
  <ім'я> mapred.tasktracker.map.tasks.maximum </name>
  <значення> 2 </value>
  <опис> Максимальна кількість завдань на карті, які будуть виконуватися
  одночасно трекером завдань.
  </description>
</property>

<власність>
  <ім'я> mapred.tasktracker.reduce.tasks.maximum </name>
  <значення> 2 </value>
  <опис> Максимальна кількість скорочень завдань, які будуть виконуватися
  одночасно трекером завдань.
  </description>
</property>

Я хочу змінити саме (mapred.tasktracker.map.tasks.maximum value) за моїм значенням мого вихідного сценарію, і не змінювати інше значення (Максимальна кількість скорочень завдань) поза ним, Як я можу це зробити ?!


1
Чи можете ви додати приклад свого XML-файлу, яку частину ви хочете змінити і як?
Адалі

обидва ці значення знаходяться у XML-файлі, і я хочу змінити перше на моєму скрипті оболонки, як я можу це зробити? наприклад <property> <ім'я> mapred.tasktracker.map.tasks.maximum </name> <value> 2 </value> <description> Максимальна кількість завдань на карті, які будуть виконуватися одночасно трекером завдань. </description> </property> <property> <ім'я> mapred.tasktracker.reduce.tasks.maximum </name> <value> 2 </value> <description> Максимальна кількість скорочень завдань, які будуть виконуватися одночасно трекер завдань. </description> </property> перше 2 за значенням 4
avishan sharafi

2
Чому ви не один раз публікуєте своє те саме питання? superuser.com/questions/962975/…
Прасанна

1
Коли ви публікуєте приклад XML, будь ласка, позначте його як КОД - тобто вставте його, а потім позначте та натисніть кнопку {}-поруч над текстом.
Ханну

Відповіді:


0

Перш за все, ваш 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підвузла, фільтрувати лише ті імена, які мають даний текст ( [text()='mapred.tasktracker.map.tasks.maximum']), піднятися на один вузол ( .., знову у власність), потім перейдіть до valueпідрозділу.

Результат буде надруковано в stdout. Якщо ви хочете, щоб xmlstarlet змінив файл замість цього, додайте -Lпісля -P.


0

1. Використовуйте XML-аналізатор

Якщо ви збираєтесь маніпулювати XML, вам слід скористатися інструментом, розробленим спеціально для цієї мети. (У Unix немає таких інструментів, вбудованих.) Про це неодноразово обговорювалося на Stack Exchange:

XMLStarlet (про який згадував Вернер Генце ) начебто широко рекомендується.

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 '/<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).
  • Перехід до наступного рядка.
  • Спробуйте замінити значення.
  • Якщо заміна вдалася, перескочіть до кінця петлі.
  • Якщо ми бачимо кінець a property, відгалужуємо до кінця циклу, тому що ми вже не в mapred.tasktracker.map.tasks.maximumданих.
  • В іншому випадку відведіть до початку циклу і повторіть вище.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.