У меня огромный XML-файл, и мне нужно извлечь содержимое целого тега, который содержит последовательность чисел.В моем файле все по одной строке, я добавил здесь разрывы строк, чтобы сделать его более читабельным
Итак, у меня есть упрощенный пример
Файл:
<ORDERS>
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>12345</tag3><tag4>ccc</tag4></IDOC>
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>23456</tag3><tag4>ccc</tag4></IDOC>
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>0007537181</tag3><tag4>ccc</tag4></IDOC>
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>34567</tag3><tag4>ccc</tag4></IDOC>
</ORDER>
Iхочу соответствовать тегу IDOC BEGIN, который содержит последовательность 0007537181. Таким образом, это будет
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>0007537181</tag3><tag4>ccc</tag4></IDOC>
Пока я получил это регулярное выражение:
cat myfile | grep -oP '<IDOC BEGIN.*?0007536846.*?</IDOC>'
, что приводит ко всему с началапервый тег с тем же именем до того, который я хочу:
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>12345</tag3><tag4>ccc</tag4></IDOC>
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>23456</tag3><tag4>ccc</tag4></IDOC>
<IDOC BEGIN><tag1>aaa</tag1><tag2>bbb</tag2><tag3>0007537181</tag3><tag4>ccc</tag4></IDOC>
Мне удалось обойти это, отправив это второму регулярному выражению, которое получает последнее вхождение IDOC BEGIN
cat myfile | grep -oP '<IDOC BEGIN.*?0007536846.*?</IDOC>' | grep -oP '<IDOC BEGIN(?!.*<IDOC BEGIN).*?</IDOC>'
Подводя итог, мне нужно получить последнюю IDOC BEGIN перед последовательностью числа
Имейте в виду, что в исходном файле нет разрывов строк, все в одной строке.