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

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

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

  • Отфильтруйте содержимое буфера обмена без использования промежуточного файла
  • Как я могу отображать 3 строки текста за один раз на 1 строку?
  • sed + удалить слово из определенной строки
  • Как читать несколько строк вместо строк
  • Как получить код выхода grep, но распечатать все строки?
  • Как я могу извлечь числа в файле с помощью sed или любого другого инструмента?
  • Добавить столбцы в текстовый файл с заданным интервалом в Bash
  • Заменить строку последовательным индексом
  • 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 – добавить новую строку
    Interesting Posts

    Как создать команду bash, которая создает вывод, который точно имитирует исходный текстовый файл, который можно вставить в оболочку bash, где включен histexpand?

    что-то ужасно неправильно с pkg-config

    Обновлять phpmyadmin вручную при установке в виде пакета

    Mount / umount cdrom на основе события udev

    Есть ли причина использовать « || команда "вместо" && command "?

    sed, получив ошибку: sed -e выражение # 1, команда char 28: unterminated `s '

    Разбор произвольных дат естественного языка под BSD

    Вложенная строка grep выводит строку с надписью «(стандартный ввод)»

    Настройка bash для многих серверов

    Сделать скрипт командной строки выполнять команды в telnet или программах

    Почему изменение $ PATH влияет на дочерние оболочки, но с изменением $ foo нет?

    Преобразовать файл Evolution filters.xml в Thunderbird msgFilterRules.dat?

    parse json с использованием python

    Lightdm, показывающий greeter на внешнем мониторе

    Как я могу увеличить каталоги по умолчанию в дереве дерева vim?

    Linux и Unix - лучшая ОС в мире.