2016-05-29 86 views
1

我正在开发一个bash脚本,需要一些复杂的正则表达式帮助...至少对我来说很复杂!Bash。正则表达式匹配

在将卡放入监视器模式后,我有一些可能的输出变化很小,取决于发行版和aircrack套件版本,它们几乎没有变化。一些字符串我需要解析是:

(mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon) 
(mac80211 monitor mode vif enabled on [phy0]wlan0mon 
(monitor mode enabled on wlanmon0) 
(monitor mode enabled on wlanmon0 

我需要从这些字符串取接口的新名字......在这种情况下如此wlan0mon,但可以根据卡的不同。

正如你所看到的,有时候会有最后一个括号“)”,有时候没有。有时我有[某事],有时候不是。我需要从“开始”(注意后面的空间)取出这些变化,直到结束......我有一种方法,但没有快乐。它只适用于具有“]”的字符串,并且不知道如何避免所有可能性。

[[ ${new_interface} =~ ^(.*)\]+([a-zA-Z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[2]}" 

有什么建议吗?谢谢!

回答

1

这将是更简单的

[[ ${new_interface} =~ \]?([A-Za-z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[1]}" 
0

哦,我知道了......绝望让我测试,测试和测试......最后,我得到了它与所有变化的工作。这是解决办法:

[[ ${new_interface} =~ ^(.*on[[:space:]])(\[.*\])?([a-zA-Z0-9]+)\)?$ ]] && new_interface="${BASH_REMATCH[3]}" 

干杯。

+0

考虑在\使用字符类[A-ZA-Z0-9] '=〜\(\ [[[:alnum:]] + \]) ?([[:alnum:]] +)?\)$' – diwo