Quando defino a IFS
variável como um espaço, bash
trata vários espaços como um espaço ( myprogram
é um programa que imprime os argumentos da linha de comando que recebe):
IFS=" "
x="hello hi world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world
Mas quando defino a IFS
variável como vírgula, bash
não trata várias vírgulas como uma vírgula:
IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] =
argv[3] =
argv[4] = hi
argv[5] =
argv[6] =
argv[7] = world
Por que é que?
Respostas:
Isso está documentado em
man bash
. Uma única ocorrência de qualquer caractere no IFS que não seja espaço em branco delimita um campo.De
man bash
:Exemplos: divisão de campo
Se o IFS não tiver caracteres de espaço em branco, o espaço em branco será incluído nos campos:
Se o IFS tiver espaços em branco e uma vírgula, as sequências de espaços em branco, seguidas por uma vírgula, seguidas por sequências de espaços em branco, serão tratadas como um único delimitador:
Sequências de vírgulas são interpretadas como sequências de campos vazios:
Exemplos: espaço em branco à esquerda e à direita
Se o IFS não contiver espaços em branco, os espaços em branco à esquerda e à direita serão mantidos nos campos:
Se o IFS contiver espaços em branco, as seqüências iniciais ou finais de espaços em branco serão removidas:
fonte
awk
com a-F'\t'
opção oucut
. Como alternativa, se você possui uma versão recentebash
, poderá analisar os campos usandoreadarray
a-d$'\t'
opção