Keresés

Részletes keresés

NevemTeve Creative Commons License 2005.11.21 0 0 56
Ezek a házifeladatok csak nem írják meg önmagukat?!

Volt: while read L; do echo "#$L#"; done
Lett: while IFS='' read L; do echo "#$L#"; done
Előzmény: Kekkb (55)
Kekkb Creative Commons License 2005.11.21 0 0 55
Most egy olyan problémával állok szemben, hogy egy szöveget kell tükröznöm a középvonalára függőlegesen. Ezzel nem is lenne gond, csak a sor eleji sorközöket valamiért nem kezeli külön karakternek. Próbáltam awk-val és egyszerűen while read-del is , de a sor eleji szóközöket nem akarja tükrözni egyik sem.
Valakinek valami ötlet?
Kekkb Creative Commons License 2005.11.21 0 0 54
köszi
Közben nekem is leesett:)
Előzmény: NevemTeve (53)
NevemTeve Creative Commons License 2005.11.21 0 0 53
Na jó, tündérke leszek: amiképpen ^ jelöli a sor elejét, hasonlóképpen $ a sor végét...
NevemTeve Creative Commons License 2005.11.21 0 0 52
Valakinek lenne valamilyen ötlete?
Igen (hátha ebből megtanulod, hogy ne eldöntendő kérdést tegyél fel)
Előzmény: Kekkb (51)
Kekkb Creative Commons License 2005.11.20 0 0 51
Most egy olyan problémám lenne, hogy egy szövegben a szöveg eleji, illetve a szöveg végi (több) helyközt kellene törölnem. A szöveg eleji megy is seddel, de a végit nem tudom. Valakinek lenne valamilyen ötlete?
locsemege Creative Commons License 2005.11.16 0 0 50
Köszi, ma is tanultam valamit.
Előzmény: NevemTeve (49)
NevemTeve Creative Commons License 2005.11.16 0 0 49
%s - string
%20s - string fixhosszú mezőben, jobbra igazítva
%-20s - string fixhosszú mezőben, balra igazítva
%-*s - string változóhosszú mezőben, balra igazítva, a mezőhosszat egy külön paraméter tartalmazza
Előzmény: locsemege (48)
locsemege Creative Commons License 2005.11.16 0 0 48
Hogy is van ez a %-*s?
Előzmény: NevemTeve (47)
NevemTeve Creative Commons License 2005.11.16 0 0 47
#!/bin/sh
if [ $# -ne 1 ]; then
 echo "usage: $0 <file>"
 exit
fi

LINELEN=$(wc -L <"$1")

while IFS='' read LINE; do
 printf "%-*s\n" "$LINELEN" "$LINE"
done <"$1"
Előzmény: NevemTeve (46)
NevemTeve Creative Commons License 2005.11.16 0 0 46
Akkor sajnos kétszer kell végigolvasni a file-t, hiszen nem tudod előre a leghosszabb sor hosszát...
Van még valamilyen feltétel azon kívül, hogy "nem C"? Tehét mondjuk Fortran vagy FORTH vagy bármi?
Előzmény: Kekkb (44)
locsemege Creative Commons License 2005.11.15 0 0 45
Már ott a megoldás. De van egy másik lehetséges is:

n=5
spaces='                 '
echo "$line${spaces:0:n}"
Előzmény: Kekkb (44)
Kekkb Creative Commons License 2005.11.15 0 0 44
A feladat lényege, hogy egy szövegben a rövidebb sorokat úgy kell egyenlő hosszúvá tenni, hogy a sorvégekre megfelelő szóközt írunk.
az n a soronként változik.
Mindig a leghosszabb sorhosszból kivonom az aktuális sorhosszát.
Előzmény: locsemege (39)
locsemege Creative Commons License 2005.11.15 0 0 43
NevemTeve ötletén alapuló bash-es változat:

printf "%s%${n}s\n" "$line" ''

Lehet, hogy nem látszik jól, de a végén az két aposztrof, nem pedig egy idézőjel.
Előzmény: Kekkb (41)
Kekkb Creative Commons License 2005.11.15 0 0 42
Nem c-ben kell.:)
Előzmény: NevemTeve (40)
Kekkb Creative Commons License 2005.11.15 0 0 41
az n változó
Előzmény: locsemege (39)
NevemTeve Creative Commons License 2005.11.15 0 0 40
printf ("%s%*s\n", line, n, "");

Ha nem C-ben kell, akkor szóljál!
Előzmény: Kekkb (38)
locsemege Creative Commons License 2005.11.15 0 0 39
Az n változó, vagy konstans?
Előzmény: Kekkb (38)
Kekkb Creative Commons License 2005.11.15 0 0 38
Azt szerintetek hogyan lehet megoldani, hogy az kiirassunk egy sort, és még utána n db szóközt. Az n az adott.
locsemege Creative Commons License 2005.11.04 0 0 37
Időközben én is rájöttem, el is szégyelltem magam alaposan. Remélem, ez még nem az időskori szenilitás jeleként tudható be nálam. :(
Előzmény: NevemTeve (36)
NevemTeve Creative Commons License 2005.11.04 0 0 36
Az a kérdésem, hogy a subprocesszen belüli echo által az stdout-ra küldött adatot az echo-t követő read miért nem olvassa fel?

Mert nincs köztük pipeline.
Előzmény: locsemege (34)
locsemege Creative Commons License 2005.11.04 0 0 35
Na, már jó példát sem tudok írni:

while read a; do echo "xx${a}xx"; done </etc/fstab
Előzmény: locsemege (34)
locsemege Creative Commons License 2005.11.04 0 0 34
Az a kérdésem, hogy a subprocesszen belüli echo által az stdout-ra küldött adatot az echo-t követő read miért nem olvassa fel? Bár igaz, ebben az esetben ez sem működne:

while read a; do echo "xx$axx"; done </etc/fstab

hiszen az echo elrontaná a következő alkalommal futó read számára az adatot. Azért egy kis homálytizedelést tarthatnál erről. Persze jó, hogy így működik, csak nem teljesen világos, hogy miért.
Előzmény: NevemTeve (33)
NevemTeve Creative Commons License 2005.11.04 0 0 33
echo -e 'aa\nbb' | ( (read x; echo $x); read y; echo $y)
Egészen pontosan mi ezzel a gond? Az össes "read" stdin-je az lesz, amit az "echo"-tól kap... ezen a zárójelek nem változtatnak, pl
echo -e 'aa\nbb' | { read x; echo $x; read y; echo $y; }
ugyanazt eredményezi
Előzmény: locsemege (32)
locsemege Creative Commons License 2005.11.04 0 0 32
Ez ugyan jól hangzik, csak az a baj, hogy ha a külső ciklus elindul a pipe miatt egy önálló processzben - és ennek valóban így kell lennie -, a belső ciklusnak nincs oka önállósodni. De ha igen, még akkor is zavaros számomra, mert a belső ciklus read-je - jelen esetben éppen a feladatnak megfelelően ugyan - ugyanabból az stdinből szedi fel az adatot, ahonnan a külső ciklus read-je. Viszont a két ciklus között az echo-val az stdout-ra piszkítottam, s azt vártam, hogy a belső read-je ezt néha visszaszedi, és ezért hibás lesz a működés. Azonkívül az stdin-t, stdout-ot és stderr-t nem szokta meghatni a különprocessz.

Példa:

echo a | (read x; echo $x)
a

echo b | (sleep 1; (read x; echo $x); )
b

Az echo a | read x; echo $x nem működik "jól", de ez azért van, mert a read a pipe miatt subshell-ben futva ott hozza létre az x változót, amely a programra nézve lokális, a subshellből való kilépéskor annak memóriaterülete az x értékével együtt felszámolódik. Ez világos.

Amit nem egészen értek, az ez:

echo -e 'aa\nbb' | ( (read x; echo $x); read y; echo $y)
aa
bb

holott nem lennék meglepve az
aa
aa

válaszon sem, hiszen az az echo $x aa-ját a read y akár fel is szedhetné. Kipróbáltam még ezt is:

echo -e 'aa\nbb' | ( (read x; echo $x); read y z; echo $y $z)
aa
bb

de szó sincs arról, hogy csak a sorrend miatt van így, s a pipe-on maradt volna az aa. Bár ez nem túl meglepő, mert akkor nem íródott volna ki a terminálra az első sorban. Ingoványos ez nekem, tényleg nem tiszta teljesen. :(
Előzmény: Zahy (31)
Zahy Creative Commons License 2005.11.04 0 0 31
Mert a pipe miatt a ciklusod al-shell-ben - magyarul masik shell-ben - fut. (Ha esetleg utanakeresel, akkor megtalalhato, hogy az echo a | read x ; echo "$x" legtobb shellben "jol" mukodik (kiveve pl. pdksh), de ha ciklus van, akkor mar nem. Explicite persze nem sok helyen irjak le.)
Előzmény: locsemege (30)
locsemege Creative Commons License 2005.11.03 0 0 30
Kérdés mindenkihez: az echo által stdout-ra küldötteket miért nem szedi fel a belső while-ban lévő read? Ez attól függ, hogy futásidőben hogy jön ki, tehát esetleges? Vagy?

A 28-as hozzászólásomat nézzétek!
locsemege Creative Commons License 2005.11.03 0 0 29
Egyébként ezt inkább awk-val érdemes csinálni.
Előzmény: locsemege (28)
locsemege Creative Commons License 2005.11.03 0 0 28
Megy, ha kijavítod, mert kissé bugos volt. Nézd ezt a változatot:

n=2
seq 20 |\
while read
do
echo "$REPLY"
i=1
while ((i++<n)) && read
do
:
done
done

Az egyik hiba az i kezdőértéke volt, a másik, hogy nem növeltem a ciklusváltozót, a harmadik, hogy a read-et kell a ciklusváltozó vizsgálata után rakni, különben akkor is eldobja a sort, amikor már nem kéne. A seq 20 |\ csak a teszteléshez kell, ez állítja elő a sorokat. Egyébként az egy érdekes probléma, hogy az echo által stdout-ra küldötteket miért nem szedi fel a belső while-ban lévő read, de ha ez mégis bekövetkezne, érdemes az echo kimenetét pl. a standard errorra küldeni:

echo "$REPLY" >/dev/stderr
Előzmény: Kekkb (27)
Kekkb Creative Commons License 2005.11.03 0 0 27
a $REPLY nélkül megy. köszi szépen
Előzmény: locsemege (26)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!