BASH从字符串中提取链接href
我有一个bash变量,它包含如下内容: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
<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