使用
bash regular expressions :
re='http://([^/] )/) )。
if[$name=~~$re]; then echo ${BASH_REMATCH[1]}; fi
编辑op提示语法说明。 Regular expression syntax是一个很大的话题,虽然在这里无法全面介绍,但是为了充分理解这个例子,我会尝试一下。
re='http://([^/] )/) )。
这是存储在bash变量中的正则表达式。 这意味着您希望输入字符串匹配并提取子字符串。 打破它:
http://只是一个字符串。 输入字符串必须包含正则表达式匹配的子字符串
[]通常使用方括号表示“匹配括号中的任何字符”。 因此,c [ao] t与“猫”和“婴儿床”一致。 []的^字符已更改为“匹配方括号中的任何字符”,因此在这种情况下,[^ /]将匹配除“/”之外的任何字符。
方括号表达式只能匹配一个字符。 在最后添加时,说“匹配一个或多个上一个子表达式”。 因此,[^ /]匹配一个或多个所有字符的集合,并且不包含“/”。
在子表达式周围)放置括号意味着保存与该子表达式匹配的后续处理。 如果您的语言支持此功能,将提供获取这些子匹配的机制。 对于bash,这是BASH_REMATCH数组。
最后,完全匹配“/”,以使所有完全限定的域名方法与以下“/”匹配
接下来,您需要根据正则表达式测试输入字符串以确定它们是否匹配。 要执行此操作,请使用bash条件。
if[$name=~~$re]; then
echo ${BASH_REMATCH[1]}
fi
在bash中,[ ]指定扩展条件测试,并且可以包括=bash正则表达式运算符。 在这种情况下,测试输入字符串$ name是否与正则表达式$ re匹配。 如果匹配,则由于正则表达式的结构,括号() ) ) ) )保证存在子匹配)。 可以使用BASH_REMATCH数组进行访问。
数组中的元素0 $ {BASH_REMATCH [0]}是正则表达式匹配的整个字符串,即“http://www.google.com/”。
数组的后续元素是子匹配的后续结果。 请注意,正则表达式按顺序对应多个子匹配(-bash _ rematch元素)。 所以在这种情况下,$ {BASH_REMATCH [1]}包含“www.google.com”。 我觉得这是你想要的字符串。
请注意,BASH_REMATCH数组的内容仅在上次使用正则表达式=operator时应用。 所以如果继续进行更多的正则表达式匹配,每次都必须从这个数组中保存需要的东西。
这可能看起来像是一个很长的解释,但它真正掩盖了正则表达式的复杂性。 他们非常强大,相信体面的表达,但正则表达式的语法很复杂。 正则表达式的实现也不同,因此不同的语言支持不同的功能,在语法上可能会有微妙的差异。 特别是正则表达式中的字符转义可能是一个难题。 特别是当这些字符在特定语言中具有不同的含义时。
请注意,您可以通过在条件中引用此变量,将正则表达式直接放置在条件中,而不是将$ re变量设置为另一行。 但是,在bash 3.2中,对于是否需要这样的字符正则表达式引号,这些规则进行了更改。 将正则表达式放入另一个变量是一种简单的方法,可以在所有支持=match运算符的bash版本中按预期执行。