QL.túra

Kulturális smörgåsbord Esterházytól Wass Albertig, a gumicsizmától az iPad-ig, a Teletabiktól Sexpírig, a makrofágtól a mikrokontrollerig, miazmás...

Címkék

2000 (20) 2001 (6) 2002 (16) 2003 (164) 2004 (61) 2005 (40) 2006 (31) 2007 (28) 2008 (33) 2009 (175) 2010 (188) 2011 (201) 2012 (86) 2013 (40) 2014 (36) 2015 (26) 2016 (10) adáshiba (91) android (1) animáció (93) cygwin (3) film (410) gezarol (13) hájtek (159) hangoskönyv (32) ipad (17) klip (12) könyv (191) linux (29) színház (169) vers (17) windows (37) zene (111) Címkefelhő

+jegyzések

Most ...

... múlok .osan

bmi_tiny.png


... hallgatom
Szabó Magda: Régimódi történet
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSqTmZEqlCRFgojyt52Q2n_qiMTyVlt-zJu-DpbNKVY6OQbBh4u


... olvasom
Alexander Steele (szerk.): Kezdő írók kézikönyve


... (Kik ezek? Kik ezek az embek? Kik ezek?)
profile for TrueY on Stack Exchange, a network of free, community-driven Q&A sites
free counters

[Hájtek] File-ban levő sorok beolvasása egy bash tömbbe

2012.04.16. 11:00 | TrueY | Szólj hozzá!

Címkék: linux 2012 hájtek cygwin

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
ketto ketto2
harom harom3
A kimenet:

3
[egy egy1]
[ketto ketto2]
[harom harom3]
<egy egy1 ketto ketto2 harom harom3>
{egy}
{egy1}
{ketto}
{ketto2}
{harom}
{harom3}
(egy egy1)
(ketto ketto2)
(harom harom3)
Bevallom, hogy a '<...>' sort nem értem. Én azt tippeltem volna, hogy a '{...}' sorokhoz hasonló eredményt fog produkálni.

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!

A bejegyzés trackback címe:

https://qltura.blog.hu/api/trackback/id/tr643521622

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása