Sokszor előforduló probléma, hogy egy file-ban levő string-eket kell beolvasni egy tömbbe. Természetesen bash-ban is megoldandó és megoldható probléma. Igazából csak akkor van probléma, ha a betöltendő sorokban van whitespace karakter.
Valamit tenni kell a beolvasandó szóelválasztó karakterrel (IFS, Input Field Separator). Érdekes, hogy a bash oldalán csak egy eldugott jegyzetben van szó, hogyan lehet egy környezeti változóba idióta karaktereket becsempészni. Ez pedig a $'string'. Ezt rendszeresen elfelejtem...
A másik trükk az, hogy a beolvasást általában így szokják megoldani: `cat file`. Modernebbül $(cat file). Mivel ez sűrűn előfordul, ezért a cat elindítását is meg lehet spórolni: $(<file).
oldIFS="$IFS"
IFS=$'\n' arr=($(<file.txt))
IFS="$oldIFS"
echo ${#arr[*]};
for i in "${arr[@]}"; do echo "[$i]"; done
for i in "${arr[*]}"; do echo "<$i>"; done
for i in ${arr[*]}; do echo "{$i}"; done
for ((i=0; i<3; ++i)); do echo "(${arr[$i]})"; done
Az első sor elmenti az eredeti elválasztó karaktert. A második beolvassa a file-t. Harmadikban visszaállítjuk az eredeti elválasztó karaktereket (alapban space, tab, soremelés). A negyedikben kiírja a beolvasott elemek számát. Az utolsó négy sorban különböző képen kiírjuk a tömb tartalmát. Figyeljük meg, hogy nem mindegy, hogy '*'-ot, vagy '@'-ot használunk.
Nézzünk egy példát. A bemeneti file tartalma
egy egy1
A kimenet:
ketto ketto2
harom harom3
3
Bevallom, hogy a '<...>' sort nem értem. Én azt tippeltem volna, hogy a '{...}' sorokhoz hasonló eredményt fog produkálni.
[egy egy1]
[ketto ketto2]
[harom harom3]
<egy egy1 ketto ketto2 harom harom3>
{egy}
{egy1}
{ketto}
{ketto2}
{harom}
{harom3}
(egy egy1)
(ketto ketto2)
(harom harom3)
Ha a tömbben levő elemek mondjuk file-ok, akkor így szerkeszthetjük mindegyiket egyszerre:
vim "${arr[@]}"
Ha egy előre meghatározott pattern-t keresünk, akkor így könnyíthetjük a munkánkat:
vim +/"Valamilyen szoveg" "${arr[@]}"
Ezzel minden file megnyitása után közvetlenül a megtalált sorra lép és 'n' nyomogatásával ugyanerre ismétlőleg rákereshetünk.
Sok sikert!
Forduljunk elő minden nap!
+jegyzések