[ milan82 @ 17.02.2006. 13:19 ] @
Evo nesto se zezam u bashu i naisao sam na sljedeci problem. Imam liniju npr.

Code:
 Elitesecurity je odlican forum.|stvarno je dobar


Ono sto mi treba je sljedece: kako izbrisati znak "|" i sve desno od njega (do kraja linije), tako da mi ostane samo prva recenica? Mislim da to sed moze uraditi ali ne uspjevam shvatiti kako.
[ Gojko Vujovic @ 17.02.2006. 13:27 ] @
Na primer u perl-u:

bash-2.05b$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | perl -e 'while(<>){s/(.*)\|.*/\1/;print;}'
Elitesecurity je odlican forum.


Sigurno da može kraće i jednostavnije drugim alatima, ali eto ti nešto za početak. Dodaću kasnije još neko rešenje ako stignem.
[ Gojko Vujovic @ 17.02.2006. 13:34 ] @
AWK rešenje:

$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | awk -F '|' '{print $1}'
Elitesecurity je odlican forum.
[ Gojko Vujovic @ 17.02.2006. 13:36 ] @
Cut rešenje:

$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | cut -d '|' -f 1
Elitesecurity je odlican forum.
[ Gojko Vujovic @ 17.02.2006. 13:41 ] @
Sed rešenje:

$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | sed "s/|.*//"
Elitesecurity je odlican forum.
[ Gojko Vujovic @ 17.02.2006. 13:43 ] @
Perl varijanta koju više volim:

$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | perl -e 's/\|.*//&print while<>'
Elitesecurity je odlican forum.
[ milan82 @ 17.02.2006. 13:52 ] @
Gojko legenda si, hvala!
[ Gojko Vujovic @ 17.02.2006. 13:54 ] @
Np.

Cut može i kraće:

$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | cut -d\| -f1
Elitesecurity je odlican forum.
[ alex @ 17.02.2006. 14:56 ] @
Moze i krace i sa Perlom:
$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | perl -ne 's/\|.*//&print'
Elitesecurity je odlican forum.


alex.
;)
[ milan82 @ 17.02.2006. 16:16 ] @
E, imam jos jedan problem:
kako hvatam pojedinu liniju iz file-a sa:

Code:
varijabla=`head -$broj file | tail -1`


onda mi varijabla ima newline na kraju. Taj newline bi htio ukloniti.
Mozda ima neki drugi nacin hvatanja odredene linije bez newline-a?

[ Gojko Vujovic @ 17.02.2006. 16:25 ] @
Bravo alex :) dao si mi ideju, ako ćemo već da pravimo sed od perla, može još 5 bajtova kraće:

$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | perl -pne 's/\|.*//'
Elitesecurity je odlican forum.


Dalje od ovoga ne znam kako da skratim.
[ Gojko Vujovic @ 17.02.2006. 16:35 ] @
milan82: Dodavanjem:

| perl -pe chop


na kraj skidaš newline karakter.
[ Gojko Vujovic @ 17.02.2006. 16:37 ] @
A može i:

| tr -d '\n'
[ Gojko Vujovic @ 17.02.2006. 16:51 ] @
Perl regexp rešenje, ali nažalost nije kraće od chop varijante odozgo:

|perl -pe's!\n!!'
[ milan82 @ 17.02.2006. 16:52 ] @
Pokusao, ne radi:

Code:
varijabla=`head -$broj file | tail -1 | perl -pe chop`


(probao i tr varijantu). Newline mi ipak ostane?!
[ Gojko Vujovic @ 17.02.2006. 17:03 ] @
Da nisi možda štampao to sa echo ali bez -n?

echo po defaultu dodaje newline na kraj. Pogledaj man echo.

Daj celu skriptu ili relevantan deo, pa da vidimo gde i kako primećuješ postojanje neželjenog newline karaktera.
[ Gojko Vujovic @ 17.02.2006. 17:06 ] @
Meni se sad čini da ni onaj head i tail ne pokupe newline sa sobom, nego da se on vidi zbog echo-a. Ispadne da je stripping nepotreban.
[ Gojko Vujovic @ 17.02.2006. 17:11 ] @
Evo ono rešenje odozgo skraćeno za još dva bajta. Kada se koristi -p, ne mora se navoditi i -n za autoloop, pošto -p radi i to sam po sebi.

echo "Elitesecurity je odlican forum.|stvarno je dobar" | perl -pe's/\|.*//'


Ali najbolji je sed, tu ne mora ni single quote oko regexpa:

echo "Elitesecurity je odlican forum.|stvarno je dobar" | sed s/\|.*//
[ milan82 @ 17.02.2006. 17:36 ] @
Code:

Xdialog --icon $ikona --title "Pitanje" \
        --inputbox "$pitanje" 50 45 2> unos/unos.tmp.$$

retval=$?

input=`cat unos/unos.tmp.$$`
echo "upisao:"$input
todg=`head -$number PIO/odgovori | tail -1 | perl -pe chop`

if [ "$input" = "$todg" ]
then
echo "Tocno!"
let tocnih=($tocnih+1)
echo $tocnih

else
echo "znaci da je krivo..."
echo "#$input#"
echo "#$todg#"
fi



Na izazu dobijem npr.

Code:

upisao:chip
znaci da je krivo...
#chip#
#chip



Problem se vidi na izlazu, ispis sam stavio unutar gradela (#) tako da se tocno vidi da je uneseno:chip, a string s kojim se usporeduje je chip+newline ...
[ Gojko Vujovic @ 17.02.2006. 17:49 ] @
Izgleda da nam se shellovi drugačije ponašaju. Vidi ovo:


fireball:$cat test
test 1 2 3 | prva linija
test 2 3 4 | druga linija
test 4 5 6 | treca linija
test 555 test linija bez delimitera
fireball:$cat t.sh
#!/bin/sh

todg=`head -2 test|tail -1`
echo "#$todg#"

fireball:$sh t.sh
#test 2 3 4 | druga linija#


Ovako nešto i očekuješ, zar ne? Nema dodatnog strippinga, a opet ne sadrži newline posle onog tail -1.
[ Gojko Vujovic @ 17.02.2006. 17:58 ] @
Probao sam na bash i sh, na freebsd, linuxu i windowsu, svuda se isto ponaša.

Iz fajla koji sadrži:

prva
druga
treca


Skripta radi ovako:

~/test # bash t.sh
#druga#


Jesi li siguran da fajl sa odgovorima sadži samo \n na kraju linije? Ne pada mi ništa drugo na pamet.
[ milan82 @ 17.02.2006. 18:10 ] @
Koristio sam cut varijantu:

Code:

$ echo "Elitesecurity je odlican forum.|stvarno je dobar" | cut -d '|' -f 1
Elitesecurity je odlican forum.


To sam iskoristio da "rasjepam" file na dva filea, pitanja i odgovori. I sad je problem sto nikako ne mogu dobiti tocan odgovor, stringovi se razlikuju...
[ Gojko Vujovic @ 17.02.2006. 20:59 ] @
Okači par linija originalnog fajla, pa da probamo, ne pada mi ovako ništa na pamet.

Uradi upload uz poruku kako bi se sačuvao pravi sadržaj fajla. Ne moraš ceo, izdvoj par linija.
[ milan82 @ 18.02.2006. 09:52 ] @
Evo stavio sam dio fajla, obradivao sam ga da dobijem pitanja sa:

Code:

cat file | cut -d\| -f1 >pitanja.cut


za odgovore:

Code:

cat file | cut -d\| -f2 >odgovori.cut


Na pitanje se upisuje odgovor cija se tocnost provjerava u fajlu sa odgovorima i tu dolazi do problema. Znaci, kad se iscitava odgovor sa:

Code:

todg=`head -$number odgovori.cut | tail -1`


Varijabla todg dobije na kraju neki znak (newline), i na ispisu imam npr:

Code:

#chip#        #ono sto je uneseno, gradele stavljene samo da se vidi tocan string
#chip          #string koji se usporeduje s prethodnim, ocito razlicit


a trebalo bi biti: chip=chip

Code:

#chip#
#chip#


??


[ milan82 @ 18.02.2006. 13:14 ] @
Definitivno je problem u "cijepanju" fajla. Rucno sam unio neki string u proizvoljni file i onda je bez problema prepoznat unos, tj. stringovi se poklapaju. Nikako mi ne ide u glavu zasto ne moze prepoznat stringove (odgovore) koji su nastali "cijepanjem".
[ milan82 @ 20.02.2006. 12:49 ] @
Rijesio sam problem, caka je bila u tome sto je na krajevima pojedinih stringova bio space, uklonio sam ga i sada radi kako treba.
Gojko, hvala na trudu!
[ milan82 @ 20.02.2006. 12:50 ] @
... i alexu takoder!