2017-08-06 130 views
1

在頁面https://developer.android.com/studio/index.html,有一個鏈接到Linux的Android SDK工具,我想通過腳本下載。不幸的是,沒有用於下載最新版本的「簡單」鏈接,所以我想從HTML本身提取鏈接。如何從Bash中的文件中提取HTML錨點的href?

鏈接由ID linux-tools識別幷包含在多行:

<a onclick="return onDownload(this)" id="linux-tools" data-modal-toggle="studio_tos" 
    href="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip">sdk-tools-linux-38593 

我想提取href成一個bash腳本變量。到目前爲止,我得到的最接近的是:

grep -o -z '<a.[^<]*id="linux-tools"[^<]*</a>' index.html 

它輸出上述兩行。

如何使用通常可用的shell命令獲取實際鏈接?

+0

我建議使用XML/HTML解析器(xmlstarlet,xmllint ...)。 – Cyrus

+0

@Cyrus是的,我知道。我有一個Python腳本,可以做到這一點,但是我的當前環境限制使用bash腳本,而不是嵌入任何其他語言並且不安裝其他工具。 – Roxy

回答

0

你的正則表達式是非常接近的。剩下要做的就是提取href部分:

grep -zoP '<a[^<]*id="linux-tools"[^<]*href="\K[^"]+' index.html 

我們使用PCRE(-P)和PCRE的特殊轉義序列,the reset match start \K,這會導致不被包含在最終的匹配序列中的任何先前匹配的字符(我們需要只有雙引號之間的部分)。

0

您可以使用sed首先選擇你想工作的範圍,例如:

sed -n '/id="linux-tools"/,+1 p' index.html 

這會給你從包含id="linux-tools"加一行一行的地址。

現在你可以使用sed替代品,只是從範圍提取href

sed -n '/id="linux-tools"/,+1 s/.*href="\([^"]*\).*$/\1/p' index.html