提取子字符串传递变量以进行剪切

时间:2015-04-20 12:24:56

标签: bash unix

是否可以在bash cut中执行类似的操作:

strLf="JJT9879YGTT"
strZ=(2, 3, 5, 6, 9, 11)
numZ=${#strZ[@]}
for ((ctZ=0; ctZ<${numZ}; ctZ++))
do
   lenThis=${strZ[${ctZ}]}
   fetch=$(echo "${strLf}" | cut -c 1-${lenThis})
done

通过连续循环,我希望${fetch}根据"JJ" "JJT" "JJT98" "JJT987" "JJT9879YG" "JJT9879YGTT"给出的索引包含strZ等。

或者还有其他方法需要这样做吗?

3 个答案:

答案 0 :(得分:2)

您可以使用${string:position:length}length开始获取$string position个字符。

$ s="JJT9879YGTT"
$ echo ${s:0:2}
JJ
$ echo ${s:0:3}
JJT

还使用变量:

$ t=5
$ echo ${s:0:$t}
JJT98

因此,如果您将所有这些值放在一个数组中,您可以遍历它们并将其值用作length参数${string:0:length}

strLf="JJT9879YGTT"
strZ=(2 3 5 6 9 11)
for i in ${strZ[@]}; do
    echo "${strLf:0:$i}"
done

对于你给定的字符串,它将它返回给我:

$ for i in ${strZ[@]}; do echo "${strLf:0:$i}"; done
JJ
JJT
JJT98
JJT987
JJT9879YG
JJT9879YGTT

答案 1 :(得分:0)

words="JJT9879YGTT"
strZ=(2 3 5 6 9 11)
for i in "${strZ[@]}"
do
  echo ${words:0:$i}
done

输出:

JJ
JJT
JJT98
JJT987
JJT9879YG
JJT9879YGTT

DEMO

答案 2 :(得分:0)

意识到我的错误 - 我在数组中使用逗号来识别元素。

所以不是我用的东西:

strZ=(2, 3, 5, 6, 9, 11)

我必须使用:

strZ=(2 3 5 6 9 11)

它也适用于cut