Como faço para dividir uma string contra um caractere no BASH?

7

Gostaria de poder dividir um código de autorização pelo caractere - para que eu possa operar em cada segmento individualmente. Eu não quero usar binários externos ( awk , grep ) - isso é para ser o mais minimalista possível. Quais são algumas maneiras de conseguir isso?

Aqui está um exemplo de código de autenticação:

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

    
por Jay Hellwig 22.08.2012 / 19:32

5 respostas

15

Tente usar o Separador de campos internos ( 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)

Saída:

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

Ao definir o Separador de campo interno, você divide AUTH_CODE no caractere - , permitindo que você percorra os elementos recém-criados em um loop foreach .

    
por 22.08.2012 / 19:35
5

Você pode usar o IFS, mas isso é mais simples:

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

Por favor, preste atenção no - adicionado após a string ser dividida - a leitura ignorará o último token de outra forma.

    
por 22.08.2012 / 19:47
4

Outra forma de correspondência de padrões e matriz:

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

Use apenas a expansão de parâmetros:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
echo "${AUTH_CODE//-/$'\n'}"

Saída:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb
    
por 29.08.2012 / 16:57
0
for i in {1..10}; do echo '82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'|cut -d"-" -f$i;done
    
por 23.08.2012 / 16:02