Как извлечь из файла текст между токенами, используя bash-скрипты - PullRequest
2 голосов
/ 01 февраля 2011

Я читал этот вопрос: Извлечение строк между 2 токенами в текстовом файле с использованием bash , потому что у меня очень похожая проблема ... Я должен извлечь (и сохранить его в переменной $ перед печатью)текст в этом XML-файле:

<--more labels up this line>
<ExtraDataItem name="GUI/LastVMSelected" value="14cd3204-4774-46b8-be89-cc834efcba89"/>
<--more labels and text down this line-->

Мне нужно только получить значение = (очевидно, без скобок и без 'value ='), но сначала, я думаю, что нужно искать "GUI / LastVMSelected", чтобыперейдите к этой строке, потому что в других строках может быть аналогичное поле значения, а значение этой метки - то, что я хочу.

Ответы [ 4 ]

3 голосов
/ 01 февраля 2011

Если они находятся на одной линии (как кажется из вашего примера), это даже проще. Просто:

sed -ne '/name="GUI\/LastVMSelected"/s/.*value="\([^"]*\)".*/\1/p'

Пояснение:

  • -n: подавить печать по умолчанию
  • / name = "GUI \ / LastVMSelected" /: только строки, соответствующие этому шаблону
  • с /. значение = "([^"])». / \ 1 / р
    • подставить все, взяв в скобки часть (значение значения)
    • и распечатать результат
1 голос
/ 01 февраля 2011

Используйте это:

for f in `grep "GUI/LastVMSelected" filename.txt | cut -d " " -f3`; do echo ${f:7:36}; done
  • grep получает только те строки, которые вам нужны
  • cut разбивает строки, используя некоторый разделитель, и возвращает N-й результат разбиения
  • -d " " устанавливает разделитель на пробел
  • -f3 возвращает третий результат (индексирование на основе 1)
  • ${f:7:36} извлекает подстроку, начиная с индекса 7, длиной 36 символов. Это избавляет от ведущего value=" и конечного слэша и т. Д.

Очевидно, что если порядок полей изменится, это сломается, но если вам нужно что-то быстрое и грязное, что работает, это должно быть именно так.

1 голос
/ 01 февраля 2011

Я предполагаю, что вы извлекаете из XML-документа.Если это так, взгляните на XMLStarlet инструменты командной строки для обработки XML.Здесь есть некоторая документация для запроса документов XML здесь .

0 голосов
/ 01 февраля 2011

Используя мой ответ на вопрос, который вы связали:

sed -n '/<!--more labels up this line-->/{:a;n;/<!--more labels and text down this line-->/b;\|GUI/LastVMSelected|s/value="\([^=]*\)"/\1/p;ba}' inputfile

Объяснение:

  • -n - не делайте неявной печати
  • /<!-- this is token 1 -->/{ - если начальный маркер найден, то
    • :a - метка "a"
      • n - читать следующую строку
      • /<!-- this is token 2 -->/q - еслиэто конечный маркер, выход
      • \|GUI/LastVMSelected| - если строка соответствует строке
        • s/value="\([^"]*\)"/\1/p - вывести строку после 'value =' и до следующей цитаты
    • ba - переход к метке "a"
  • } конец, если
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...