После использования 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
Я могу знать, как я могу сделать это использование сценария оболочки?
Обычно, я советовал бы использовать надлежащий синтаксический анализатор HTML для парсинга HTML.
Однако эти данные выглядят довольно простыми: использование двойной кавычки (дополнительно сопровождаемый "v") как разделитель полей, захватите 2-е поле каждой строки. Затем присоединитесь к частям с запятыми
result=$( grep ... file.html | awk -F'"v?' '{print $2}' | paste -sd, )
echo "http://x.y.z/$result.mp3"
Принятие Вас имеет входные данные от Вашего вопроса, сохраненного в файле, названном 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
. Обратите внимание, что всех наклонных черт в строке нужно оставить с обратной косой чертой. С 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
Во-первых, необходимо будет выяснить, как получить текст, который необходимо произвести. Так как другие ответы показывают, как сделать это, я не должен буду включать ту информацию в свой ответ.
Однако я буду обращаться, как произвести ту информацию в файл.
, Чтобы сделать это, вставьте > filename
после Вашей команды. Это перезапишет содержание файла (создающий его, если это не будет существовать) со стандартным выводом (stdout) используемой команды.
альтернативный метод должен использовать >>
вместо >
, чтобы добавить текст в файл вместо этого, вместо того, чтобы перезаписать его.