LINUX.ORG.RU

Добавить строку перед n-ым вхождением тега в XML файле

 ,


0

1

Здравствуйте! Есть xml файл: <ex1> .. </ex1> <ex2> .. </ex2> ... ... ... <ex1> .. </ex1> <ex2> .. </ex2> Нужно вставить <ex3>... </ex3> между </ex1><ex2>, но не для первого, а для 2 или 3.

sed -i.bak «s/<ex2> blabla /2» text.xml - добавляет строку blabla перед каждым <ex2>, но нужно перед n-sv Помогите, пожалуйста!

есть утилитка для того что бы парсить xml xpath поштудируй мб поможет. она умеет находить определенный тег

Flover
()
Ответ на: комментарий от Flover

xmllint из libxml2-utils возможно. Никогда ей не пользовался, но у нее есть аргумент --xpath&

       The xmllint program parses one or more XML files, specified on the command line as XML-FILE (or the standard input if the filename provided is - ). It prints various
       types of output, depending upon the options selected. It is useful for detecting errors both in XML code and in the XML parser itself.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

Обрабатывать xml sed'ом это очень-очень плохая идея. Не делайте так.

$ cat 1.txt 
<xml>
 <ex1> a </ex1> <ex2> b </ex2> <ex1> c </ex1> <ex2> d </ex2>
 <ex1> e </ex1> <ex2> f </ex2> <ex1> g </ex1> <ex2> h </ex2>
 <ex1> i </ex1> <ex2> j </ex2> <ex1> k </ex1> <ex2> l </ex2>
 <ex1> m </ex1> <ex2> n </ex2> <ex1> o </ex1> <ex2> p </ex2>
</xml>
$ cat 1.txt | sed 's/<ex2>/INCREDIBLEMARK<ex2>/g' | sed 's/INCREDIBLEMARK//; T; :L; n; b L' | sed 's/INCREDIBLEMARK/<ex3> Z <\/ex3> /; T; :L; n; b L' | sed 's/INCREDIBLEMARK//g'
<xml>
 <ex1> a </ex1> <ex2> b </ex2> <ex1> c </ex1> <ex3> Z </ex3> <ex2> d </ex2>
 <ex1> e </ex1> <ex2> f </ex2> <ex1> g </ex1> <ex2> h </ex2>
 <ex1> i </ex1> <ex2> j </ex2> <ex1> k </ex1> <ex2> l </ex2>
 <ex1> m </ex1> <ex2> n </ex2> <ex1> o </ex1> <ex2> p </ex2>
</xml>
$ cat 2.txt 
<xml>
 <ex1> a </ex1>
 <ex2> b </ex2>
 <ex1> c </ex1>
 <ex2> d </ex2>
 <ex1> e </ex1> <ex2> f </ex2> <ex1> g </ex1> <ex2> h </ex2>
 <ex1> i </ex1> <ex2> j </ex2> <ex1> k </ex1> <ex2> l </ex2>
 <ex1> m </ex1> <ex2> n </ex2> <ex1> o </ex1> <ex2> p </ex2>
</xml>
$ cat 2.txt | sed 's/<ex2>/INCREDIBLEMARK<ex2>/g' | sed 's/INCREDIBLEMARK//; T; :L; n; b L' | sed 's/INCREDIBLEMARK/<ex3> Z <\/ex3> /; T; :L; n; b L' | sed 's/INCREDIBLEMARK//g'
<xml>
 <ex1> a </ex1>
 <ex2> b </ex2>
 <ex1> c </ex1>
 <ex3> Z </ex3> <ex2> d </ex2>
 <ex1> e </ex1> <ex2> f </ex2> <ex1> g </ex1> <ex2> h </ex2>
 <ex1> i </ex1> <ex2> j </ex2> <ex1> k </ex1> <ex2> l </ex2>
 <ex1> m </ex1> <ex2> n </ex2> <ex1> o </ex1> <ex2> p </ex2>
</xml>

Первая версия (в удалённых) была с ошибкой.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.