Извлечение нескольких экземпляров текста между двумя строками

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

Экземпляр текстового файла:

{"tracks":[{"date":"2014-12-14","country":"TW","track_url":"https:\/\/play.spotify.com\/track\/34gCuhDGsG4bRPIf9bb02f","track_name":"Thinking Out Loud","artist_name":"Ed Sheeran","artist_url":"https:\/\/play.spotify.com\/artist\/6eUKZXaKkcviH0Ku9w2n3V","album_name":"x","album_url":"https:\/\/play.spotify.com\/album\/1xn54DMo2qIqBuMqHtUsFd","artwork_url":"http:\/\/o.scdn.co\/300\/646e9619750dfa3d1eadbbea959dc6f528a9109e","num_streams":51672,"window_type":"weekly","percent_male":58,"percent_age_group_0_17":4,"percent_age_group_18_24":45,"percent_age_group_25_29":25,"percent_age_group_30_34":12,"percent_age_group_35_44":7,"percent_age_group_45_54":1,"percent_age_group_55_plus":6}, 

Текст, который я хочу извлечь, – это название дорожки. Желаемый вывод из вышеуказанного текстового файла:

 1 Thinking Out Loud 2 xxx 3 xxx 

Для этого я хотел бы использовать команды sed и nl для извлечения текста между строками

 "track_name":" and ", 

… и вывод результатов в другой текстовый файл

  • Почему пустая выгрузка этого `sed ... << END_SED | вырезать ... `?
  • как подражать «замените abb a» на sed?
  • Разбор строк файла данных с помощью разделителя Вместо EOL
  • Как использовать оболочку для получения IPv6-адреса с MAC-адреса?
  • Удаление новых символов линии вокруг шаблонов
  • Обработка текста с использованием sed / awk / perl
  • Поиск и удаление строк, содержащих несколько шаблонов в файле
  • Тестирование регулярного выражения из stdin с помощью grep | sed | awk
  • 2 Solutions collect form web for “Извлечение нескольких экземпляров текста между двумя строками”

    Если у вас есть GNU grep, вы можете использовать регулярные выражения, совместимые с perl. Это удобно из-за утверждений обхода:

     grep -oP '(?<=track_name).*?(?=,)' filename 

    Это примерное выражение, которое соответствует вашему предоставленному вводу и дает вам желаемый результат. Используя этот метод, мы вынуждаем sed выполнять поиск + замену (и) в каждой строке, заменяя всю строку только частью в середине, если строка содержит имя трека и запятую. Затем мы печатаем только согласованные строки (p).

     [me:~]$ cat work/tmp/example.txt {"tracks":[{"date":"2014-12-14","country":"TW","track_url":"https:\/\/play.spotify.com\/track\/34gCuhDGsG4bRPIf9bb02f","track_name":"Thinking Out Loud","artist_name":"Ed Sheeran","artist_url":"https:\/\/play.spotify.com\/artist\/6eUKZXaKkcviH0Ku9w2n3V","album_name":"x","album_url":"https:\/\/play.spotify.com\/album\/1xn54DMo2qIqBuMqHtUsFd","artwork_url":"http:\/\/o.scdn.co\/300\/646e9619750dfa3d1eadbbea959dc6f528a9109e","num_streams":51672,"window_type":"weekly","percent_male":58,"percent_age_group_0_17":4,"percent_age_group_18_24":45,"percent_age_group_25_29":25,"percent_age_group_30_34":12,"percent_age_group_35_44":7,"percent_age_group_45_54":1,"percent_age_group_55_plus":6}, [me:~]$ sed -n 's/.*track_name":"\(.*\)","artist_name.*/\1/p' work/tmp/example.txt | nl 1 Thinking Out Loud раз в [me:~]$ cat work/tmp/example.txt {"tracks":[{"date":"2014-12-14","country":"TW","track_url":"https:\/\/play.spotify.com\/track\/34gCuhDGsG4bRPIf9bb02f","track_name":"Thinking Out Loud","artist_name":"Ed Sheeran","artist_url":"https:\/\/play.spotify.com\/artist\/6eUKZXaKkcviH0Ku9w2n3V","album_name":"x","album_url":"https:\/\/play.spotify.com\/album\/1xn54DMo2qIqBuMqHtUsFd","artwork_url":"http:\/\/o.scdn.co\/300\/646e9619750dfa3d1eadbbea959dc6f528a9109e","num_streams":51672,"window_type":"weekly","percent_male":58,"percent_age_group_0_17":4,"percent_age_group_18_24":45,"percent_age_group_25_29":25,"percent_age_group_30_34":12,"percent_age_group_35_44":7,"percent_age_group_45_54":1,"percent_age_group_55_plus":6}, [me:~]$ sed -n 's/.*track_name":"\(.*\)","artist_name.*/\1/p' work/tmp/example.txt | nl 1 Thinking Out Loud 

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

    Тем не менее, это зависит от того, что «track_name» находится прямо перед «artist_name», и ни одна из этих строк не находится нигде в строке. Это работает с GNU Sed.

    В конечном счете, это, вероятно, не самый подходящий инструмент для работы, поскольку у вас есть явно отформатированный (json) текст, поэтому использование чего-то, что может анализировать json, было бы более надежным. Различные версии sed могут поддерживать разные расширения для регулярного выражения, поэтому результаты могут варьироваться в зависимости от платформы.

    Interesting Posts

    Как я могу сделать резервную копию всего моего программного обеспечения в файлах для переустановки на другую систему Linux?

    Как показать только короткую раскладку клавиатуры в i3blocks с помощью kbdd_layout?

    В чем разница между заменой и трубопроводом на bash

    Использовать переменные в этой строке

    Измерение использования ОЗУ в программе

    Инструмент для измерения качества энтропии?

    Как установить max. яркость ноутбука после запуска

    Возможно ли создать RAID-массив mdadm с параметрами макета и ближайшего макета?

    Нужно ли указывать подстановки команд при назначении их вывода переменной?

    Как ускорить X по быстрому соединению? (особенно по ssh)

    Возобновить последнее задание печати из командной строки

    Как изменить целевой каталог для завершения табуляции?

    Принуждение «добавленного» псевдонима к каждой команде

    SSH-подобный сеанс, который выживает при отключении физической сети

    chroot для пользователя sftp

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