Kiedy ustawię IFS
zmienną na spację, bash
traktuje wiele spacji jako jedną spację ( myprogram
jest to program, który wypisuje otrzymane argumenty wiersza poleceń):
IFS=" "
x="hello hi world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world
Ale gdy ustawię IFS
zmienną na przecinek, bash
nie traktuje wielu przecinków jako jednego przecinka:
IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] =
argv[3] =
argv[4] = hi
argv[5] =
argv[6] =
argv[7] = world
Dlaczego?
Odpowiedzi:
Jest to udokumentowane w
man bash
. Pojedyncze wystąpienie dowolnego znaku w IFS, który nie jest spacją, ogranicza pole.Od
man bash
:Przykłady: dzielenie pól
Jeśli IFS nie ma znaków białych znaków, to białe pola są zawarte w polach:
Jeśli IFS ma zarówno spacje, jak i przecinek, to sekwencje spacji, po których następuje przecinek, a następnie sekwencje spacji są traktowane jako pojedynczy separator:
Sekwencje przecinków są interpretowane jako sekwencje pustych pól:
Przykłady: wiodące i końcowe białe znaki
Jeśli IFS nie zawiera białych znaków, wszelkie początkowe i końcowe białe znaki są przechowywane w polach:
Jeśli IFS zawiera spacje, wówczas usuwane są wszystkie wiodące lub końcowe sekwencje spacji:
źródło
awk
z-F'\t'
opcji lubcut
. Alternatywnie, jeśli masz najnowszą wersjębash
, możesz być w stanie przeanalizować pola zareadarray
pomocą-d$'\t'
opcji.