IFS problema de divisão

3

Estou usando a seguinte linha no início de um script de shell bash:

IFS=':#:'

Mas não é um campo separado com: # :, apenas com dois-pontos. Qual é o problema?

EDITAR:

Estes são meus dados no arquivo txt e estou lendo:

f:#:0
c:#:Test C
s:#:test S
ctype:#:0
a:#:test A
t:#:10:02:03
r:#:test r

f:#:0
c:#:Test C1
s:#:test S1
ctype:#:1
a:#:test A1
t:#:00:02:22
r:#:test r

f:#:20
c:#:Test C
s:#:test S
ctype:#:2
a:#:test A1
t:#:00:02:03
r:#:test r

Usando o seguinte código:

IFS=':#:'   
while read -r key value; do
 .....
done < "$FileName" 
    
por Bhumi Shah 28.12.2016 / 06:04

2 respostas

2

Como apontado por @heemayl, o problema é que o IFS não trata a string inteira como o separador, ele trata cada caractere como um separador individual. awk , no entanto, é capaz de usar uma string como um delimitador.

Por exemplo:

#!/bin/bash
while read -r key value
do 
   printf 'key %-7s val %s\n' "$key" "$value" 
done < <(awk -F ':#:' '{print $1" "$2}' $FileName )

key f       val 0
key c       val Test C
key s       val test S
key ctype   val 0
key a       val test A
key t       val 10:02:03
key r       val test r
key         val 
key f       val 0
key c       val Test C1
key s       val test S1
key ctype   val 1
key a       val test A1
key t       val 00:02:22
key r       val test r
key         val 
key f       val 20
key c       val Test C
key s       val test S
key ctype   val 2
key a       val test A1
key t       val 00:02:03
key r       val test r
    
por 28.12.2016 / 06:18
2

IFS não usa vários caracteres (ou um intervalo) como separador; cada caractere em IFS é tratado como um separador de campo.

De man bash :

IFS The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is <space><tab><newline>.

    
por 28.12.2016 / 06:09