Многократные скрининг в гольф

#!/usr/bin/env bash URL_1=http://www.squid-cache.org/Versions/ URL_2=$(curl "$URL_1" | sed -n '/Stable Versions/{p; :loop n; p; /rolling/Iq; b loop}' | grep -i rolling | cut -d \" -f 2) URL_3=$(curl "$URL_1""$URL_2" | sed -n '/Latest/{p; :loop n; p; /.gz/q; b loop}' | grep .gz | cut -d \" -f 2) wget "$URL_1""$URL_2""$URL_3" 

Могу ли я каким-либо образом укоротить приведенный выше код на одну строку кода?

Нехорошо определить так много переменных, чтобы просто что-то загрузить.

Один лайнер, как было заказано 🙂

Переменная URL_1 используется для удобства чтения. Это не обязательно.

 #!/bin/bash URL_1=http://www.squid-cache.org/Versions/ curl "$URL_1" | grep -Pzo '(?s)Stable Versions.*?langpack' | sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p' | xargs -I{} wget "${URL_1}"{} 
  1. grep -Pzo '(?s)Stable Versions.*?langpack'
    • -P Интерпретировать шаблон как регулярное выражение, совместимое с Perl.
    • -z необходимый для многострочного поиска.
    • -o печатать только согласованные (непустые) части соответствующей строки.
    • (?s) Включить «dot match newline» для остальной части регулярного выражения. Информация: встроенные модификаторы .
    • .*? не жадные соответствия.
  2. sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p'
    • создайте эту часть здесь: v3/3.5/squid-3.5.26.tar.gz
    • $,$ обрабатывать только последнюю строку.
    • Я использую знак подчеркивания вместо косой черты для команды s ubstitute, из-за косой черты в тегах </tr> и </td> . Пример: s_foo_bar_ вместо s/foo/bar/
  3. xargs -I{} wget "${URL_1}"{}
    • передать две конкатенированные части в wget по xargs : http://www.squid-cache.org/Versions/ и v3/3.5/squid-3.5.26.tar.gz .

EDIT – версия без xargs (здесь она не нужна):

 #!/bin/bash URL_1=http://www.squid-cache.org/Versions/ wget "${URL_1}$(curl "$URL_1" | grep -Pzo '(?s)Stable Versions.*?langpack' | sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_\1squid-\2.tar.gz_p')" 

Однострочный, используя lynx а не curl .

 $ lynx -dump -listonly -nonumbers \ "$(lynx -dump -listonly -nonumbers http://www.squid-cache.org/Versions/ | awk '/^http:.*\/Versions\/v/ {print ; exit}')" | awk '/^http:.*\.tar.gz/ {print; exit}' http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.26.tar.gz 

Чтобы фактически загрузить последнюю стабильную версию источника кальмаров, оберните всю партию в wget "$(....)"