我有一个例子字符串,像这样:Test "checkin_resumestorevisit - Online_V2.mt" Run
我想在bash中提取两个引号之间的文本。我尝试使用以下命令:
SUBSTRING=${echo $SUBSTRING| cut -d'"' -f 1 }
但是它会出现error: bad substitution
错误。
我有一个例子字符串,像这样:Test "checkin_resumestorevisit - Online_V2.mt" Run
我想在bash中提取两个引号之间的文本。我尝试使用以下命令:
SUBSTRING=${echo $SUBSTRING| cut -d'"' -f 1 }
但是它会出现error: bad substitution
错误。
替代方法1:
SUBSTRING=`echo "$SUBSTRING" | cut -d'"' -f 2`
备选方案2:
SUBSTRING=`echo "$SUBSTRING" | awk -F'"' '{print $2}'`
方案三:
set -f;IFS='"'; SUBSTRING=($SUBSTRING); SUBSTRING=${SUBSTRING[1]};set +f
SUBSTRING='*"foo"'
并且这段代码在非空目录中运行,请看看它会做什么。更安全的方法是使用 read
在 IFS 上分割。 - Charles Duffyecho "$SUBSTRING" | ...
。 - Charles Duffy如果您想提取第一个 "
和最后一个 "
之间的内容:
s='Test "checkin_resumestorevisit - Online_V2.mt" Run'
s=${s#*'"'}; s=${s%'"'*}
echo "$s"
其他让@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/")
<<<
)创建一个临时文件,就像为 here documents 一样。
SUBSTRING='*"inside text" outside text'
IFS=\" eval '_=($SUBSTRING);SUBSTRING="${_[1]}"'
IFS=\" read -ra _ <<<"$SUBSTRING";SUBSTRING=${_[1]}
*"foo"
会发生什么。话虽如此,我肯定喜欢使用 read
方法 -- 如果修复或删除中间错误的建议,它将获得我的赞同。 - Charles Duffy*
。你怎么期望代码避免这个问题? - Charles Duffytouch 'foo ' 'bar ' baz
,那么你在上面的评论中的例子将显示 globbing -- 在 IFS 中没有空格,所以第一个双引号前的空格被视为字面量,因此当要匹配的唯一项是 foo
、bar
和 baz
(名称中没有空格)时,glob 找不到匹配项。 - Charles Duffy
${}
而不是$()
。 - Charles Duffy