庆典。使用bash_rematch的regexp

时间:2016-06-23 15:04:23

标签: regex bash

我有一个var,它可以在之前和/或之后有单引号或空格:

var="' /path/to/somewhere '"
var=" /path/to/somewhere "#<- here is a space at the end
var="/path/to/somewhere'"
var=" /path/to/somewhere '"

我需要使用bash rematch的regexp来清除可能的单引号或前后空格

我知道可以这样做:

var=${var##+([ \'])}
var=${var%%+([ \'])}

但我需要用BASH_REMATCH(长期解释xd)。我正在尝试:

[[ ${var} =~ ^([\' ]*)?(.+)([\' ])?$ ]] && var="${BASH_REMATCH[1]}"

但它不起作用。可能。+正在获得其余的字符串。我怎样才能得到有趣的部分?感谢。

1 个答案:

答案 0 :(得分:2)

你的示例中的.+是导致问题的原因,因为它是贪婪的,所以它将消耗该行的其余部分。

在这种情况下,您可以通过要求中间部分以空格或'以外的其他内容结束来阻止它这样做:

re='^[ '"'"']*(.*[^ '"'"'])[ '"'"']*$'
[[ $var =~ $re ]] && echo "${BASH_REMATCH[1]}"

在单引号字符串中插入文字'"'"'需要看起来很讨厌的'。在bash中使用正则表达式时,推荐的方法是使用单引号定义包含模式的变量,然后使用它,不带引号(此方法适用于支持正则表达式的所有bash版本)。