Извлечение текста из файла и вывода строка в файл

После использования grep на файле HTML, я получаю следующий вывод:

      <div id="v3060000-3062005" class="BLAH...>
      <div id="v50001027-50002018" class="BLAH...>
      <div id="v907200-907202" class="BLAH...>
      <div id="v20024011-20024012" class="BLAH...>

Я должен извлечь строки чисел от строк выше и объединить их в URL, такой как:

http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3

Я могу знать, как я могу сделать это использование сценария оболочки?

5
задан 30 September 2016 в 10:05

4 ответа

Обычно, я советовал бы использовать надлежащий синтаксический анализатор HTML для парсинга HTML.

Однако эти данные выглядят довольно простыми: использование двойной кавычки (дополнительно сопровождаемый "v") как разделитель полей, захватите 2-е поле каждой строки. Затем присоединитесь к частям с запятыми

result=$( grep ... file.html | awk -F'"v?' '{print $2}' | paste -sd, )
echo "http://x.y.z/$result.mp3"
6
ответ дан 23 November 2019 в 08:42

Принятие Вас имеет входные данные от Вашего вопроса, сохраненного в файле, названном data.txt, можно использовать эту команду для генерации URL:

grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/'

Вот выполненный пример:

$ grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/'
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3

, Что это делает:

  • grep -Po '\d+-\d+' data.txt извлечения весь NUMBER-NUMBER последовательности от Ваших данных, как 3060000-3062005 и выводы одна последовательность на строку.
  • tr '\n' ',' преобразовывает все символы новой строки его входа к запятым, эффективно присоединяясь к строкам вместе.
  • sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/' удаляет запаздывающую запятую из ее входа и встраивает его в строку http://x.y.z/\1.mp3, заменяя \1. Обратите внимание, что всех наклонных черт в строке нужно оставить с обратной косой чертой.
5
ответ дан 23 November 2019 в 08:42

С awk:

... | awk -F'"' '{part=part substr($2,2) ","} \
                  END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}'
  • -F'"' наборы разделитель полей как "

  • part=part substr($2,2) ","} получает второе поле, и substr($2,2) добирается, снимает изоляцию с запуска v от строки, и результат сохраняется с добавлением запаздывания , как переменная part

  • END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}, блок выполняется после парсинга всех записей, здесь мы снимаем изоляцию с последнего , от переменной part и печатаем желаемый отформатированный вывод

Пример:

% cat file.txt
      <div id="v3060000-3062005" class="BLAH...>
      <div id="v50001027-50002018" class="BLAH...>
      <div id="v907200-907202" class="BLAH...>
      <div id="v20024011-20024012" class="BLAH...>

% awk -F'"' '{part=part substr($2,2) ","} END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}' file.txt
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3
4
ответ дан 23 November 2019 в 08:42

Во-первых, необходимо будет выяснить, как получить текст, который необходимо произвести. Так как другие ответы показывают, как сделать это, я не должен буду включать ту информацию в свой ответ.

Однако я буду обращаться, как произвести ту информацию в файл.

, Чтобы сделать это, вставьте > filename после Вашей команды. Это перезапишет содержание файла (создающий его, если это не будет существовать) со стандартным выводом (stdout) используемой команды.

альтернативный метод должен использовать >> вместо >, чтобы добавить текст в файл вместо этого, вместо того, чтобы перезаписать его.

0
ответ дан 23 November 2019 в 08:42

Другие вопросы по тегам:

Похожие вопросы: