Я уверен, что есть много способов сделать это в сценариях. Но у меня есть очень конкретный c сценарий использования, в котором мне нужно сделать это так, как я делаю.
Вот пример использования. У меня есть очень большой файл XML, и я нахожу открывающие теги с помощью следующей команды:
grep '<opening-tag>' -n ~/.dir/27-6-2019.xml | grep -Eo '^[^:]+'
Это прекрасно работает и дает мне начальную строку каждого тега. Чтобы получить закрывающий тег, все, что мне нужно сделать, это уменьшить номер строки на единицу, и это прекрасно работает в скрипте.
И затем я запускаю эту команду, чтобы получить содержимое xml в файле ( в контексте сценария):
awk 'NR >= $startingIndex && NR <= ($closingIndex - 1) path-to-file
Еще раз, это прекрасно работает.
Но то, чего я хочу достичь, это что-то вроде следующего:
grep '<open-tag>' -n ~/.dir/27-6-2019.xml | $STAT_INDEX=$(grep -Eo '^[^:]+') | if [$LAST_LINE]; awk 'NR >= $STAT_INDEX && NR <= ($LAST_LINE - 1) path-to-file > "dir/$STAT_INDEX.xml" | LAST_LINE=$STAT_INDEX
Таким образом, в основном, когда я выполняю команду grep и pipe, проверим, создал ли я var $ last_line var, а затем извлекла xml obj и сохранила его в другом файле. Причина, по которой мне нужна последняя строка, заключается в том, что при первом запуске я не знаю следующий начальный индекс нового объекта и т. Д. c.
Я не уверен, что это даже возможно. Но я стараюсь изо всех сил, чтобы сделать это в один слой.
Спасибо
Если есть какие-либо другие способы сделать это без необходимости полагаться на сценарии или инструменты, такие как терминал xml парсеры (так как я их пробовал, а они не делают то, что мне нужно), пожалуйста, дайте мне знать.
---------- grep logi c - - - - - - - - - - - -
Получаются все открытые метки
grep '<open-tag>' -n ~/.dir/27-6-2019.xml
Труба
Пример клапана: 12343:
$STAT_INDEX=$(grep -Eo '^[^:]+')
Установите переменную для доступа к остальной части процесса pipe
Pipe
Затем проверьте, установлена ли переменная, называемая последней строкой, и если да, выполните эту команду для получения xml obj из файла thr и сохраните его в своем собственном файле
if [$LAST_LINE]; awk 'NR >= $STAT_INDEX && NR <= ($LAST_LINE - 1) path-to-file > "dir/$STAT_INDEX.xml"
Pipe Сохранить последнюю строку для следующего процесса grep для обработки
LAST_LINE=$STAT_INDEX