Bash explode

Írtam egy kisebb scriptet, aminek az lenne a célja, hogy az adatok.txt-ből kinyerje az adatokat. Egy művelet körön belül 4db adat van, aztán jön a következő művelet kör. A művelet körök (;;) szeparátorral vannak elválasztva, így első körben az adathalmazt ezeknél kellene szétbontanom.

A helyett hogy eredményként ezt kapnám: t(**)teszt(**)tesztelek(**)teszteltem
Ezt kapom: t (csak egy 't' betűt)

Hol hibáztam?

scriptem.sh tartalma:

#!/bin/bash
BL=`cat adatok.txt`
IFS='(;;)' read -a arr <<< "$BL"
echo "${arr[0]}"

adatok.txt tartalma:

t(**)teszt(**)tesztelek(**)teszteltem(;;)p(**)proba(**)probalok(**)probak(;;)v(**)vala(**)valami(**)valamivalami

Hozzászólások

t\(**\)teszt\(**\)tesztelek\(**\)teszteltem\(;;\)p\(**\)proba\(**\)probalok\(**)\probak\(;;\)v\(**\)vala\(**\)valami\(**\)valamivalami\(;;\)

Esetleg használd a sed-et, az IFS állítása nélkül:


text=$(sed "s/;;/ /g" < adatok.txt)
echo $text
arr=($text)
echo ${#arr[@]}
echo ${arr[1]}

De inkább válasz valamilyen másik script nyelvet a feladathoz:)

________________________________________
https://sites.google.com/site/eutlantis/

Ne hülyéskedjetek már!
Az IFS-t nem úgy kell érteni, hogy az értékeként megadott sztring határolja az elemeket: a sztring bármelyik karaktere határolóként működik. Így lesz a tömb első eleme "t", mert azt egy határoló karakter, a "(" követi.

Ha nem is néz utána az ember, az IFS értelme azért kisakkozható, hiszen az alapértelmezett értéke , amit nyilván nem úgy gondoltak, hogy akkor kezdődik egy új szó, ha azt szóköz ÉS TAB ÉS újsor előzi meg, hanem ezek bármelyike.

Ha adatok.txt tartalmát igy változtattva:
t(**)teszt(**)tesztelek(**)teszteltem;
p(**)proba(**)probalok(**)probak;
v(**)vala(**)valami(**)valamivalamii;

Azaz mindegyik új sorba.

Majd scriptem.sh:
#!/bin/bash
filename=adat3.txt
while read -r line
do
name="$line"
done < "$filename"

Forrás

Ez igy játszana, vagy fontos hogy az adatok.txt ben egy sorba legyenek az adatok?

A feladatot nem oldja meg... nekem egy explode szerű függvényre lenne szükségem ( ilyesmire: http://php.net/manual/en/function.explode.php). A txt-t egy messzi messzi galaxisban lévő gép generálja ki amit én szedek le wget-el. Aztán ebből kell dolgoznom. a lényeg hogy egy feladathoz tartozik 4 adat: t(**)teszt(**)tesztelek(**)teszteltem; <--- itt látható és ezekkel kell tovább dolgoznom, tehát ha soronként olvasom be a txt tartalmát az se megoldás, mert aztán a következő lépésben ugyan ott állok hogy a 4 adatot explode-al szét kell választanom....

Gugliztam eleget nyilván mielőtt segítséget kértem és ezt találtam (meg csomó hasonló megoldást):
http://stackoverflow.com/questions/10586153/split-string-into-an-array-…

Itt is két karaktert használnak (egy vesszőt és egy szóközt) gondoltam az én 4 karakteres szeparátorom nem lehet gond....

A kettőt összehozva:
adatok.txt:
t:teszt:tesztelek:teszteltem
p:proba:probalok:probak
v:vala:valami:valamivalami

scriptem.sh:
#!/bin/bash
filename=adat3.txt
while read -r line
do

string="$line"
set -f # avoid globbing (expansion of *).
array=(${string//:/ })
for i in "${!array[@]}"
do
echo "${array[i]}"
done

done < "$filename"
#######

kimenet:
t
teszt
tesztelek
teszteltem
p
proba
probalok
probak
v
vala
valami
valamivalami

Esetleg:

arr=($(sed -e "s/(\*\*)/ /g" -e "s/;;/ /g" < adatok.txt))
for i in ${arr[*]}; do echo $i; done

Szerk.: A fájlban az eredeti szöveg:
t(**)teszt(**)tesztelek(**)teszteltem;;p(**)proba(**)probalok(**)probak;;v(**)vala(**)valami(**)valamivalami
________________________________________
https://sites.google.com/site/eutlantis/

Shell helyett esetleg Python? Sokkal rugalmasabb.


#!/usr/bin/python
# -*- coding: utf8 -*-

for adat in open('adatok.txt', 'r').readline().split('(;;)'):
        print "--> ", adat

+1 a Pythonra
És még "olvasható" is lenne.
Python 3-ban:

with open("adatok.txt") as ff:
  szavak= ff.read().strip().replace("(**)"," ").replace("(;;)"," ").split()
for szó in szavak:
  print(szó)

________________________________________
https://sites.google.com/site/eutlantis/