在shell脚本中使用正则表达式从字符串中提取url

时间:2012-09-11 14:19:19

标签: regex shell busybox

我需要提取一个包含<strong>标记的网址。这是一个简单的正则表达式,但我不知道如何在shell脚本中这样做。这是一个例子:

line="<strong>http://www.example.com/index.php</strong>"
url=$(echo $line | sed -n '/strong>(http:\/\/.+)<\/strong/p')

我需要$url变量中的“http://www.example.com/index.php”。

使用busybox。

4 个答案:

答案 0 :(得分:1)

这可能有效:

url=$(echo $line | sed -r 's/<strong>([^<]+)<\/strong>/\1/')

答案 1 :(得分:0)

url=$(echo $line | sed -n 's!<strong>\(http://[^<]*\)</strong>!\1!p')

答案 2 :(得分:0)

您不必使用反斜杠转义正斜杠。只需要在正则表达式中转义反斜杠。您还应该使用与? - 运算符的非贪婪匹配,以避免在HTML源代码中存在多个强标记时获得超出您想要的内容。

strong>(http://.+?)</strong

答案 3 :(得分:0)

更新:当busybox使用ash时,假定bash功能的解决方案可能无效。东西只有一点点但仍然符合POSIX标准:

url=${line#<strong>}  # $line minus the initial "<strong>"
url=${url%</strong>}  # Remove the trailing "</strong>"

如果您正在使用bash(或具有类似功能的其他shell),则可以将扩展模式匹配与参数替换相结合。 (我不知道busybox支持哪些功能。)

# Turn on extended pattern support
shopt -s extglob

# ?(\/) matches an optional forward slash; like /? in a regex
# Expand $line, but remove all occurrances of <strong> or </strong>
# from the expansion
url=${line//<?(\/)strong>}