BASH从字符串中提取链接href

BASH从字符串中提取链接href,bash,awk,sed,Bash,Awk,Sed,我有一个bash变量,它包含如下内容: <a onclick="return:false;" href="https://example.com/file-X.Y.Z.zip"><div class="btn">Linux</div></a> 我想做的是提取href部分。我确实需要获取文件名 我该怎么做?我已经试过使用sed和awk,但运气不好。。。不过,我对这些工具完全是新手,所以这肯定是我的错。在收到要求的警告后,请不要使用Bash、se

我有一个bash变量,它包含如下内容:

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

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


我该怎么做?我已经试过使用
sed
awk
,但运气不好。。。不过,我对这些工具完全是新手,所以这肯定是我的错。

在收到要求的警告后,请不要使用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"

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

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

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

方法:

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

xmlstarlet sel -t -v '//a/@href' -n <<< "$html_str"
https://example.com/file-X.Y.Z.zip
html_str=''

xmlstarlet sel-t-v'//a//@href'-nBash不应用于此类用途,但您可以使用
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

如果只需要文件名,可以执行以下操作:

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

file-X.Y.Z.zip

最好不要使用bash来解析HTML。我知道,我可以用PHP快速解析HTML,但这次我需要使用bash…您可以从bash调用其他代码片段。毕竟,调用sed或awk就是这么做的。PHP、Node、Python、Ruby甚至Perl都比bash好100倍。Bash在一般意义上根本无法做到这一点。这就像用螺丝刀打开罐头:这是可能的,但从根本上说是危险的。你不应该用sed/awk解析html/xml,这是非常糟糕的想法。这可能有效,也可能无效,这取决于HTML的易变程度。这很容易被代码中的任何
href=
实例所混淆,无论它出现在何处。这只是一个注释
filename=$(basename $(echo "$html" | grep -o 'href="[^"]*' | tail -c +7))
echo "$filename"
file-X.Y.Z.zip