обработка текста: извлечение частей файла и запись их в одну строку

У меня есть несколько файлов, отформатированных следующим образом:

... <title> Field1 : DATA_FIELD_1</title> ... <i class="blablabla"></i> <b>Field2 : </b> <span>DATA_FIELD_2</span> ... <i class="blablabla"></i> <b>Field3 : </b> <span>DATA_FIELD_3</span> ... <i class="blablabla"></i> <b>Field4 : </b> <span>DATA_FIELD_4</span > ... <i class="blablabla"></i> <b>Field5 : </b> <span>DATA_FIELD_5 </span> ... 

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

Например:

 FileID | Field1 | Field2 | Field3 | Field4 | Field5 1 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 2 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 3 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 4 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 

Мне удалось извлечь данные неправильно с помощью grep с помощью команды:

 grep -o 'Field1 : .*\|Field2 : .*\|Field3 : .*\|Field4 : .*\|Field5 : .*' File-* >> NewFile 

но это результат, который я получаю

 File-1:Field1 : DATA_FIELD_1</title> File-1:Field2 : </b> <span>DATA_FIELD_2</span> File-1:Field3 : </b> <span>DATA_FIELD_3</span> File-1:Field4 : </b> <span>DATA_FIELD_4</span > File-1:Field5 : </b> <span>DATA_FIELD_5 </span> File-2:Field1 : DATA_FIELD_1</title> File-2:Field2 : </b> <span>DATA_FIELD_2</span> File-2:Field3 : </b> <span>DATA_FIELD_3</span> File-2:Field4 : </b> <span>DATA_FIELD_4</span > File-2:Field5 : </b> <span>DATA_FIELD_5 </span> File-3:Field1 : DATA_FIELD_1</title> File-3:Field2 : </b> <span>DATA_FIELD_2</span> File-3:Field3 : </b> <span>DATA_FIELD_3</span> File-3:Field4 : </b> <span>DATA_FIELD_4</span > File-3:Field5 : </b> <span>DATA_FIELD_5 </span> 

  • Почему не матч SHA?
  • Как я могу извлечь числа в файле с помощью sed или любого другого инструмента?
  • Как удалить строки, содержащие IP-адрес?
  • Bash - Разбить предыдущие параметры команд
  • Bash - Конвертировать символ escape-символа в BBCode
  • Использование CSV-строки в качестве параметров команды
  • Как читать байты hexdump by byte в bash или awk?
  • Полосы пробелов после одиночных заглавных букв с sed
  • 2 Solutions collect form web for “обработка текста: извлечение частей файла и запись их в одну строку”

    Как правило, это плохая идея обрабатывать HTML / XML с помощью регулярных выражений, потому что они недостаточно выразительны для обработки всех угловых случаев. Однако ваш выход grep подсказывает, что мы можем в вашем конкретном случае.

    Вот способ обработки вывода, который вы получаете из команды grep с помощью sed:

     sed -e 'N;N;N;N;s/^File-\(.*\):Field1 : \(.*\)<\/title>.*Field2 : .*<span>\(.*\)<\/span *>.*Field3 : .*<span>\(.*\)<\/span *>.*Field4 : .*<span>\(.*\)<\/span *>.*Field5 : .*<span>\(.*\)\s*<\/span *>/\1 | \2 | \3 | \4 | \5 | \6/' 

    Пояснения:

    • N;N;N;N; : используется для соединения строк пять-пять (чтобы все поля из файла в одной строке)
    • s/ : запускается команда подстановки, первая часть – совпадение, вторая – замена
    • ^File-\(.*\): Соответствует номеру файла
    • Field1 : \(.*\)<\/title> : это соответствует первому полю
    • .*Field2 : .*<span>\(.*\)<\/span *> : это соответствует второму
    • /\1 | \2 | \3 / \4 | \5 | \6/ /\1 | \2 | \3 / \4 | \5 | \6/ : это замещающая часть: каждая группа, ограниченная символом \(.*\) В первой части, захватывается и повторно используется с помощью специальных переменных \1 , \2 и т. Д.

    Результат:

     1 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 2 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 3 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 

    Другим возможным подходом является использование XML-процессора. В этом случае XMLstarlet.

     xmlstarlet sel -t -v 'substring-after(//title,":")' \ -m //span -o "|" -v . \ -t -n *.xml 

    Где:

    • sel -t – выберите XML-части в соответствии со следующим шаблоном
    • -v 'substring-after(//title,":")' – это значение названия после ":"
    • -m //span -o "|" -v . – соответствует span и отпечаткам "|" и его значение
    • -t -n – добавить новую строку
    Linux и Unix - лучшая ОС в мире.