Sed soremelés probléma

Fórumok

Sziasztok!

Lehet, hogy egy baromi egyszerű dolog, de sehogy sem tudom megoldani:

Így néz ki a szöveges állomány:

adat1;
adat2;adat3;adat4;

Azt szeretném, hogy ezek egy sorban legyenek. Tehát megvizsgálja és ha azt látja, hogy adat1; akkor csinál egy sortörlést, vagy backspacet...
Hiába guglizok nem találok rá megoldást sed-del...

Eredmény;

adat1;adat2;adat3;adat4;

Hozzászólások

perl-ben viszonylag egyszerű és hordozhatóbb faék megoldás létezik, a különböző sed implementációk eltérnek tudásukban, funkciójukban gyakran a többsoros trükkök megoldásainál.

szerk: nyilván awk is jobb, speciális esetekben meg tr

szerk 2.: közben más is rájött a sed "N" utasítására, pl. egy nem egészen jó megoldás:

echo 'elso
masodik harmadik' | sed '/elso/{N};/elso.*masodik.*harmadik/{s/.*\(elso\).*\(masodik\).*\(harmadik\).*/\1 \2 \3/}'

http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

Az egesz filet egy sorban akarod tudni, vagy csak az adat1; utani ujsort akarod torolni?

Ha az elobbi, akkor sed es tr meg tudja oldani (tr -d "\n" pl). Ha utobbi, akkor fordulj bizalommal awk-hoz, erdemes vele joban lenni.

awk 'BEGIN { RS="[\n;]+"; ORS=";" } { print } END { printf "\n" }' adat.txt

A "N" a barátod:


sed "/adat1;/ {N;s/\n//;}"

Ragaszkodsz a sed-hez?

sed ":a;N;$!ba;s/\n//g" ize.txt

Egyébként tr -d "\012" < ize.txt kicsit egyszerűbb :)

a.

Egy awk-os megfejtés:


awk 'BEGIN{FS=";"}($0=="adat1;"){printf "%s",$0};($0!="adat1;"){printf "%s\n", $0}' adat.txt

Ha a sorvégi pontosvessző lemaradhat:


awk 'BEGIN{FS=";"}($1=="adat1"){printf "%s",$0};($1!="adat1"){printf "%s\n", $0}' adat.txt

Kiegészítés:
a

printf "%s\n", $0

helyett elég
a

print $0

is.

-----
"Ha javulni látod a dolgokat, akkor valami fölött elsiklottál."

delete new lines:

clear;echo -e "adat1;\nadat2;adat3;adat4;" | sed ':start /^.*$/N;s/\n//g; t start'