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

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

... <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 – добавить новую строку
  • Проблема удаления / замены специального символа °
  • Изменить имена файлов в Makefile
  • удалить содержимое с начала на первую пустую строку
  • Узнайте, на какой строке в текстовом файле соответствует слово
  • sed: многострочная замена блока конфигурации
  • Как прочитать файл свойств через мой скрипт?
  • Диапазон значений grep (/ sed / awk)
  • Необходимо вставить одинарные кавычки в текстовый файл для использования в качестве SQL-запроса с помощью sed
  • Извлечение IP-адреса из текста и сохранение его в переменной
  • bash расширяется до того же значения вместо значения строки за строкой в ​​команде sed
  • «Скобки не сбалансированы», хотя я избежал этого?
  • Linux и Unix - лучшая ОС в мире.