我是Shell脚本的新手。我想使用curl发送一个http请求,然后使用正则表达式提取一些字符串。例如,如何从http响应中提取域名?(该示例仅用于学习目的)
#!/bin/bash
name=$(curl google.com | grep "www\..*com")
echo "domain name is"
echo $name
使用bash正则表达式:
re="http://([^/]+)/"
if [[ $name =~ $re ]]; then echo ${BASH_REMATCH[1]}; fi
编辑-OP要求提供语法解释。正则表达式语法是一个很大的主题,我在这里无法完整解释,但是我将尽力进行解释以理解该示例。
re="http://([^/]+)/"
这是存储在bash变量中的正则表达式,re
即要与输入字符串匹配的内容,并希望提取子字符串。分解:
http://
只是一个字符串-输入字符串必须包含此子字符串以使正则表达式匹配[]
通常使用方括号说“匹配括号内的任何字符”。因此,c[ao]t
将同时匹配“ cat”和“ cot”。在^
该范围内的字符[]
修改是这样说的“匹配任何字符,除了那些在方括号内。因此,在这种情况下,[^/]
将除了匹配任何字符‘/’。+
其末尾添加a表示“匹配前面的子表达式中的1个或多个”。因此,[^/]+
匹配所有字符集中的1个或多个,但不包括“ /”。()
在子表达式周围加上括号表示您要保存与该子表达式匹配的任何内容以供以后处理。如果您使用的语言支持此功能,它将提供某种机制来检索这些子匹配项。对于bash,它是BASH_REMATCH数组。接下来,我们必须针对正则表达式测试输入字符串,以查看其是否匹配。我们可以使用bash条件来做到这一点:
if [[ $name =~ $re ]]; then
echo ${BASH_REMATCH[1]}
fi
在bash中,[[ ]]
指定扩展条件测试,并可以包含=~
bash正则表达式运算符。在这种情况下,我们测试输入字符串是否$name
与正则表达式匹配$re
。如果匹配,则由于正则表达式的构造,我们保证将有一个子匹配(从括号开始()
),我们可以使用BASH_REMATCH数组进行访问:
${BASH_REMATCH[0]}
将是与正则表达式匹配的整个字符串,即“ http://www.google.com/ ”。()
在正则表达式中包含多个子匹配项-BASH_REMATCH
元素将按顺序与这些子匹配。因此,在这种情况下,${BASH_REMATCH[1]}
将包含“ www.google.com”,我认为这是您想要的字符串。请注意,BASH_REMATCH数组的内容仅适用于最后一次使用正则表达式=~
运算符的时间。因此,如果继续进行更多的正则表达式匹配,则每次都必须保存该数组中所需的内容。
这似乎是一个冗长的描述,但是我确实掩盖了一些正则表达式的复杂性。它们可能非常强大,并且我相信它们的性能不错,但是正则表达式语法很复杂。正则表达式的实现也各不相同,因此不同的语言将支持不同的功能,并且语法可能会有细微的差异。特别是在正则表达式中转义字符可能是一个棘手的问题,尤其是当那些字符在给定语言中具有其他含义时。
请注意$re
,您可以将正则表达式直接放入条件中,而不必在单独的行上设置变量并在条件中引用此变量。但是在bash 3.2中,更改了有关是否需要在这些文字正则表达式周围加上引号的规则。将正则表达式放在单独的变量中是解决此问题的一种直接方法,因此该条件在支持=~
match运算符的所有bash版本中均按预期工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句