BASH从字符串中提取链接href

时间:2017-09-03 17:39:56

标签: bash awk sed

我有一个包含以下内容的bash变量:

<a onclick="return:false;" href="https://example.com/file-X.Y.Z.zip"><div class="btn">Linux</div></a>

我想做的是提取href部分。我确实需要获取文件名。

我该怎么做?我已经尝试了sedawk,但没有太多运气......虽然我对这些工具完全是新手,所以这肯定是我的错。< / p>

4 个答案:

答案 0 :(得分:3)

对于简单的情况,您可以使用sed:

sed -r 's/.*href="([^"]+).*/\1/g'

答案 1 :(得分:2)

在发出必要警告之后请不要使用Bash,sed,其他简单工具解析HTML,在这种情况下:

$ echo "$var"
<a onclick="return:false;" href="https://example.com/file-X.Y.Z.zip"><div class="btn">Linux</div></a>
$ echo "$var" | sed -E 's/^.*href/href/; s/>.*//'
href="https://example.com/file-X.Y.Z.zip"

或者,纯粹的Bash:

$ [[ $var =~ (href=\"[^\"]*\") ]] && echo "${BASH_REMATCH[1]}"
href="https://example.com/file-X.Y.Z.zip"

答案 2 :(得分:1)

Bash不应该用于此类事情,但您可以使用grep

html='<a onclick="return:false;" href="https://example.com/file-X.Y.Z.zip"><div class="btn">Linux</div></a>'

echo "$html" | grep -o 'href="[^"]*' | tail -c +7

使用tail删除href=部分也会打印:

https://example.com/file-X.Y.Z.zip

如果你只想要文件名,你可以这样做:

filename=$(basename $(echo "$html" | grep -o 'href="[^"]*' | tail -c +7))
echo "$filename"

获得:

file-X.Y.Z.zip

答案 3 :(得分:0)

正确的方法是在这种情况下使用XML / HTML解析器。

xmlstarlet方法:

{{1}}