我对bash和shell脚本非常陌生。我有一个类似的字符串
string="new string added -value:ABC-10"
现在我想要的是在-value:之后获得字符串。
我使用的是bash版本5。尝试的事物列表
- IFS方法,但这是语法错误:意外重定向
- array=(${string//:/}(这种东西
- 同时读取-r行;do行+=("$line"(;done<lt<quot$字符串">
- string='巴黎,法国,欧洲';readarray-td,a<lt<quot$字符串";;声明-p a
除了IFS之外,其他所有解决方案都会出现语法错误";("意料之中"(,我尝试了各种可能的组合,但没有成功。
感谢您的帮助。
提前谢谢。
这与bash直接相关。尝试一下:
printf "%sn" "${string##*-value:}"
bash
:
${parameter#word} ${parameter##word} Remove matching prefix pattern. The word is expanded to produce a pattern just as in pathname expansion, and matched against the expanded value of parameter using the rules described under Pattern Matching below. If the pattern matches the beginning of the value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ``#'' case) or the longest matching pattern (the ``##'' case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and the ex‐ pansion is the resultant list. If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.
使用cut
或awk
如何?
echo "$string" | awk -F '-value:' '{print $2}'
有了cut
,你只能在一个字符上分割,所以有了剪切,它会像:
echo "$string" | cut -d ":" -f 2
数组是一个不错的功能,但如果不需要,就不要使用它们。IMO,一种更简单的方法(也可以进行错误检查(是
if [[ $string =~ -value:(.*)$ ]]
then
part_after_value=${BASH_REMATCH[1]}
else
echo String does not contain a value parameter 1>&2
fi
如果要将-value存在但冒号后没有任何内容的情况视为错误,请将.*
替换为.+
。
带IFS
和read
string="new string added -value:ABC-10"
IFS=: read -r junk value <<< "$string"
echo "$value"
使用mapfile
,也称为readarray
,这是一个bash4+特性。
mapfile -td: array <<< "$string"
echo "${array[@]:1}"
也相当于
echo "${array[1]}"