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

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

... <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> 

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 – добавить новую строку
  • Проблема с sed в массиве, содержащем строки, содержащие пробелы
  • Использование 'sed' для поиска и замены
  • Как сопоставить и заменить значение атрибута внутри тега
  • Как найти строки, содержащие более 100 символов, и содержит «if»?
  • Удалить строку, если два шаблона найдены в одной строке
  • Как найти строку после регулярного выражения в одной строке текста?
  • Каким образом можно фильтровать текстовый файл для удаления пустых строк?
  • распечатать последнее поле из строки + альтернатива для awk
  • Как сопоставить шаблон и заменить только часть шаблона?
  • Как «grep» для длины строки * not * в заданном диапазоне?
  • Зацикливание файлов с пробелами в именах?
  • Мне нужно удалить. в моих данных
  • Linux и Unix - лучшая ОС в мире.