У меня есть переменная Bash, которая содержит что-то вроде этого:

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

То, что я хотел бы сделать, это извлечь часть href. Мне действительно нужно получить имя файла.

Как я могу это сделать? Я уже пробовал с sed и awk, без особой удачи ... Хотя я совершенно новичок в этих инструментах, так что, безусловно, это моя вина.

-3
ToX 82 3 Сен 2017 в 20:39

4 ответа

Лучший ответ

Для простых случаев вы можете использовать sed:

sed -r 's/.*href="([^"]+).*/\1/g'
3
user3151902 3 Сен 2017 в 17:47

После обязательного предупреждения Не анализируйте HTML с помощью Bash, sed, других простых инструментов , в этом случае:

$ 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
dawg 3 Сен 2017 в 17:55

Правильный способ - использовать парсеры XML / HTML для таких случаев.

xmlstarlet подход:

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
0
RomanPerekhrest 3 Сен 2017 в 17:52

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
1
Jonathan 3 Сен 2017 в 17:57