Поиск и замена в теге XML через sed по нескольким строкам - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу изменить значение определенного свойства тега XML.

Есть много вопросов о том, как обрабатывать sed, но проблема здесь заключается в новой строке внутри тега.

Iхотите изменить значение после name=, и его нужно искать в теге <package ... >

. XMLStarlet не поддерживается.

Coverage.xml

<package branch-rate="0.031746031746" complexity="0.0"
   line-rate="0.159420289855" name="include">
<classes>
    <class branch-rate="0.0" complexity="0.0" 

Моя лучшая попытка на данный момент:

sed -n '/<package/ {
:a
n
/<classes>/q
s/name=/xxxx/g
}' coverage.xml

Есть ли у вас идея?

ОБНОВЛЕНИЕ 2: Расширена зона покрытия.xml с подходом @ RavinderSingh13

<package branch-rate="0.031746031746" complexity="0.0"
   line-rate="0.159420289855" name="NEW_VALUE">
   <classes>
    <class branch-rate="0.0" complexity="0.0"
     filename="NEW_VALUE"
     name="NEW_VALUE">

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я только что сделал небольшую настройку, используя цикл for.

LINES=`awk '/<package /{print NR+1}' coverage.xml`

for i in ${LINES};
do 
echo $i
sed -i ''"${i}"'s/name=.*/name="NEW_VALUE"/' coverage.xml;
done

NR+1 помогает достичь второй строки в теге пакета.

0 голосов
/ 18 декабря 2018

Если вы в порядке с awk, то в соответствии с вашими показанными примерами, пожалуйста, попробуйте выполнить один раз (это будет искать только тег пакета и значение его имени, а для остальных тегов ничего не будет делать)

awk '/^>/{flag=""}  /<package/{flag=1} flag && /name=/{sub(/name=.*\"/,"name=\"NEW_VALUE\"")} 1' Input_file

Если вы хотите сохранить вывод в сам файл Input_file, добавьте > temp_file && mv temp_file Input_file к вышеуказанному коду.

...