如何在 BASH 中根据字符拆分字符串?

如何在 BASH 中根据字符拆分字符串?

我希望能够按-字符拆分授权代码,以便可以单独操作每个段。我不想使用外部二进制文件(awkgrep)——这是为了尽可能简化。我可以通过哪些方式实现这一点?

以下是授权码示例:

82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb

答案1

尝试使用内部字段分隔符IFS):

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'

OIFS=$IFS                   # store old IFS in buffer
IFS='-'                     # set IFS to '-'

for i in ${AUTH_CODE[@]}    # traverse through elements
do
  echo $i
done

IFS=$OIFS                   # reset IFS to default (whitespace)

输出:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb

通过设置内部字段分隔符,您可以AUTH_CODE-字符进行拆分,从而允许您循环遍历新创建的元素foreach

答案2

您可以使用 IFS,但这更简单:

echo "82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb"- \
  | while read -d - i; do echo "$i"; done

请注意-在拆分的字符串后添加的内容 — 否则读取将忽略最后一个标记。

答案3

使用模式匹配和数组的另一种方法:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
array=( ${AUTH_CODE//-/ } )
for j in ${array[@]} ; do echo $j ; done

答案4

for i in {1..10}; do echo '82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'|cut -d"-" -f$i;done

相关内容