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

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

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

  • Как скопировать строки из нескольких файлов в один новый файл и сохранить имя файла?
  • Как найти и заменить новую строку?
  • Нежелательное совпадение с регулярным выражением SED (эмулировать perl's. *?)
  • Как разбирать сотни html файлов исходного кода в оболочке?
  • Использование 'sed' для поиска и замены
  • Как вложить глобальные совпадения с sed?
  • Grep текст, соответствующий шаблону
  • Катить все файлы в папке, включая имя файла, используя цикл for?
  • 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

    Получить переменные среды для запуска сеанса

    назначить комбинацию клавиш для запуска скрипта

    n-factor SSH-аутентификация для CentOS 7

    Создание временного файла vs подстановка процесса и расширение переменной?

    solaris 10..не виртуальные консоли?

    Разница между хронидом и ntpd

    Список всех допустимых макетов kbd, вариантов и вариантов переключения (для использования с setxkbmap)

    Есть ли журнал ошибок для процесса, который читает файл sudoers?

    Как создать столько переменных, сколько необходимо из сценария оболочки (bash)?

    Как убить процесс с помощью одной команды?

    Возможно ли монтировать файл с разными правами собственности / разрешениями?

    Загрузка Linux из оперативной памяти

    Как (легко) иметь возможность использовать новый en _ ** locale?

    Требуется ли почтовая команда для почтового сервера?

    в чем разница между `find .` и / home / user / * в качестве входа для команды

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