我有一些示例字符串
Test "checkin_resumestorevisit - Online_V2.mt" Run
我希望在bash中提取两个引号之间的文本。 我尝试使用像
这样的命令SUBSTRING=${echo $SUBSTRING| cut -d'"' -f 1 }
但它失败了error: bad substitution
。
答案 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]}