【问题标题】:How to capture href link in BASH如何在 BASH 中捕获 href 链接
【发布时间】:2013-04-13 07:03:02
【问题描述】:

我有一个经过正则表达式的输出行,如下所示:

<a href="google.com">"test link"</a><br>

如何将不带引号的 google.com 捕获到变量中?鉴于 url 可能包含许多“/”,例如(以下乱码)

http://www.google.com/search/something/lulz/here2;i=!mfo1iu489fn1o2jlk21m4098mdoi

编辑:在上述情况下,我想要整个 url 字符串,而不仅仅是 www.google.com。

注意:不希望加载第 3 方库等来执行此操作。

【问题讨论】:

  • 我接受不带 cmets 的反对票作为拥抱。
  • 我不是反对者,但我猜是因为这是 另一个 请求,需要帮助使用正则表达式解析 html。查看stackoverflow的most upvoted answer
  • 当我要求任何本机 bash 命令时,您的假设将是错误的。唯一提到正则表达式的事实是,我已经使用正则表达式从 html 中剥离了 href 行......但我并没有要求有人使用正则表达式来解析我需要的字段数据。我已经知道这是不可能的,因为没有可用于正则表达式的“非捕获组”。 (不是攻击你,只是解释以防万一是原因)
  • grep 和 cut 不是本机 bash 命令。有关完整列表,请参阅手册页的 SHELL BUILTIN COMMANDS 部分。
  • @Jordanm,对不起,但这个问题是关于解析 __SOME_KNOWN_CHARS="wantedchars"OTHER_KNOWN_CHARSrandom_charsEND_CHARS。所以,这与解析 HTML 无关……这是一种特殊情况,没有成熟的 html 解析器也可以轻松完成……对吧?

标签: linux string bash centos5


【解决方案1】:
shopt -s nocasematch

TEXT='<a href="http://www.google.com/search/something/lulz/here2;i=!mfo1iu489fn1o2jlk21m4098mdoi">"test link"</a><br>'

TEXT=${TEXT##*href=\"}
TEXT=${TEXT%%\"*}
TEXT=${TEXT##*//}
TEXT=${TEXT%%/*}

echo $TEXT

【讨论】:

  • 如果 url 具有多个深度 '/',我仍然需要完整的 href 值
  • 不确定你的意思。您希望提取 URL 以及主机名?
  • 的意思是“没有多重深度”。例如,如果 url 只是简单的 google.com。我注意到您的代码依赖于 url 中存在的“/”。
  • @Mechaflash 已更新。请注意,这非常快,因为它不调用任何外部命令。此功能内置于 bash 本身中。
【解决方案2】:

试试这个纯 bash 正则表达式解决方案

shopt -s nocasematch    #Dont care about the character case
text='<a href="hTTtp://www.google.com/search/something/lulz/here2;i=!mfo1iu489fn1o2jlk21m4098mdoi">"test link"</a><br>'
regex='(<a\ +href=\")([^\"]+)(\">)'
[[ $text =~ $regex ]] && echo ${BASH_REMATCH[2]}

【讨论】:

  • :) 不客气——脚本有一些限制。 url 必须在双引号之间,并且不能包含双引号作为有效字符。正如@jordan 所说 - 用正则表达式解析 HTML 是不行的...... :)
  • 按照标准用法,这应该是这种情况,应该可以满足我的需要。
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 2020-04-14
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多