在bash中的两个引号之间提取字符串

时间:2016-02-25 19:17:13

标签: bash

我有一些示例字符串 Test "checkin_resumestorevisit - Online_V2.mt" Run

我希望在bash中提取两个引号之间的文本。 我尝试使用像

这样的命令
SUBSTRING=${echo $SUBSTRING| cut -d'"' -f 1 }

但它失败了error: bad substitution

3 个答案:

答案 0 :(得分:3)

如果您想在第一个"和最后一个"之间提取内容:

s='Test "checkin_resumestorevisit - Online_V2.mt" Run'
s=${s#*'"'}; s=${s%'"'*}
echo "$s"

答案 1 :(得分:3)

为了在引号之间提取子字符串,您可以使用以下方法之一:

备选方案1:

SUBSTRING=`echo "$SUBSTRING" | cut -d'"' -f 2`

备选方案2:

SUBSTRING=`echo "$SUBSTRING" | awk -F'"' '{print $2}'`

备选方案3:

set -f;IFS='"'; SUBSTRING=($SUBSTRING); SUBSTRING=${SUBSTRING[1]};set +f

答案 2 :(得分:0)

其他奇怪的想法,不要单独@arton-dorneles:^)

但我最喜欢的是@charles-duffy回答。

[[ "$SUBSTRING" =~ \"(.*)\" ]] && SUBSTRING="${BASH_REMATCH[1]}"

IFS=\" read -r _ SUBSTRING _ <<<"$SUBSTRING"

# bonus, match either ' or " by pair
SUBSTRING=$(echo "$SUBSTRING" | sed -r "s/.*?([\"'])(.*)\1.*/\2/")

请注意,bash为&#34; here string&#34;创建一个临时文件。 (<<<)和这里的文件一样。

修改

我完全理解查尔斯达菲的评论家花了太长时间;对于读者来说,这可能是在以下时间:

SUBSTRING='*"inside text" outside text'

在这种情况下,以下内容将不安全,因为星标将被展开,列出文件并移动所需的结果索引:

IFS=\" eval '_=($SUBSTRING);SUBSTRING="${_[1]}"'

IFS=\" read -ra _ <<<"$SUBSTRING";SUBSTRING=${_[1]}