Sed parameterezes

Fórumok

Sed parameterezes

Hozzászólások

[quote:b12f84e554="szaszg"][quote:b12f84e554="Hunter"]Azt szertném, hogy a sed egy bizonyos szó után n darab "valamit" tegyen.
Tehát valami hasonló kellene
echo "blablabla" | sed s/$/"valami"\{n}\/ de ez ugye nem jó...

Persze hogy nem jo, mivel minimum megcserelted a } a \ -el :-) Azutan az
'n' az mi lenne? egy fix szam, vagy valami parameter???[quote:b12f84e554="Hunter"]
Segítsetek légyszives.
szerk: a "-r" opcióval sem megy

Csak ugy altalaban szeretnem felhivni a figyelmedet, hogy a regexp-ek eseten, a
csere sztringben nem ertelmezhetoek a pattern jokerei (pl. {n,m}, + * ...)
Tehat pl. s/a/b+/g nem fogja a sorban az osszes a-t 1-nel tobb b-re cserelni :lol: :lol:

Zsiraf

p.s.: szoval a lenyeg, hogy honnet az 'n'?
p.s.2: ha param, akkor legegyszerubb sed-en kivulrol megoldani, habar sed-ben is lehet
szamolos script-et irni :-)

Az 'n' az egy változó, amely azt tárolja, hogy hány karakterrel kell megtoldani az adott szót.
A SED-en kívüli megoldás (while) baromi lassú lett, mert van amikor többszázszor kell végigmenie a while cikluson, amelyett, hogy csak annyiszor menne végig, ahány szó mögé kell írni valamit.
Tehát nem az kell, hogy 'n'-szer fusson le a SED, hanem, hogy 'n' darab valamit írjon ki.

Hali!

A feladat az lene, hogy van egy meretes sql fajl, amiben a dumpkor hiba keletkezett, tortenetesen az, hogy minden sorban a datum mezo nem kerult '-k koze. Olvasgattam egy kicsit a sed doksijat, de ido hianyaban olyanokhoz fordulnek akik rendszeresen hasznaljak a sed-et.
Minden sorban 'éééé-hh-nn óó:pp:mm' formatumban talalhato meg a datum, es ezt kellene kiegesziteni hogy elotte es utana is ' legyen.

Nem feltétlenül sed -el lehet megoldani a dolgot, (amit nem is teljesen értek) hanem ott van pl. az awk is.

ELaci

Egyszerűbb lett volna rájönni, mint a kérdést feltenni, egyébként meg
s/(dátum)/'\1'/

Konkrét megoldásokat írjatok légyszives.
Adott 'n' változó, amely azt a számot tartalmazza, hogy az adott sort hány karakterrel kell megtoldani, hogy olyan hosszú legyen, mint a leghoszabb sor.
input fájl legyen mondjuk:
1aaaaaaaaaaaaaaaaaa
2aaaaaaaa
3aaaaaaaaaaaaaaa
4aaaaaaaaaaaaaaaaaaaaaaaaaa

Tehát, hogy így nézzen ki az eredmény, ha minden sor végére ndarab a-t írunk:
1aaaaaaaaaaaaaaaaaaaaaaaaaaa
2aaaaaaaaaaaaaaaaaaaaaaaaaaa
3aaaaaaaaaaaaaaaaaaaaaaaaaaa
4aaaaaaaaaaaaaaaaaaaaaaaaaaa

Az is jó, ha 'n' változó nélkül is meg tudjátok csinálni.

Ha az n-re van épeszű felső korlátod, akkor valami ilyesmi:
[code:1:edbd071e66]
fules@chaos:~$ ALMA="izehoze"; N=4; PADDING="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; echo $ALMA${PADDING:1:$N}
izehozeaaaa
[/code:1:edbd071e66]

[quote:03f87f6398="gsimon"]Ha az n-re van épeszű felső korlátod, akkor valami ilyesmi:
[code:1:03f87f6398]
fules@chaos:~$ ALMA="izehoze"; N=4; PADDING="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; echo $ALMA${PADDING:1:$N}
izehozeaaaa
[/code:1:03f87f6398]

Köszi, de ezt így nem értem.
Legyen $szöveg az input fájl adott sora és $n az adott sort kiegészítendő karakterek száma, át tudnád írni erre az esetre a kódot?Köszi

Bocsi, itt a teljes megoldás:
[code:1:0c131b9897]
#!/bin/bash

FILE="pad.sh";
IFS=$'\n';
MAXN=0
for i in $(<$FILE);
do
if [ $MAXN -lt ${#i} ];
then
MAXN=${#i};
fi;
done;

P="."
for i in $(seq 10); do P=$P$P; done

for i in $(<$FILE);
do
echo $i${P: 1: $(($MAXN - ${#i}))}
done;
[/code:1:0c131b9897]

gsimon a szerkeztett megoldásod nekem túl lassú, nekem nagyon gyors megoldás kellene
Ennél sokkal gyorsabb:
"a" az adott sor hossza, 'b' a kivánt hossz, tehát 'n' a külömbségük
while [[ $a<$b ]]
do
echo "$fajl" | sed s/$/"a"/g)
((a=a+1))
done

Valami hasonló kellne, csak az kellene, hogy ne egyesével, kettesével... pakolja oda a sed az "a"-kat, hanem 'n'-esével.

Jézusom, de túlkombináltam! Kit érdekel, hogy mennyit kell hozzáfűzni az adott sorhoz: hozzáfűzűnk a leghosszabb sornyit és levágjuk az n. pozíciónál :) !
Az elején egyszer meg kell határozni a leghosszabb sor méretét ill. össze kell rakni ennyi '.' karaktert egy stringgé, ezt nem ússzuk meg, de onnantól már nem kell soronként rágnunk a file-t:
[code:1:376ac91033]
#!/bin/bash

FILE="pad2.sh";
IFS=$'\n';

MAXN=0
for i in $(<$FILE);
do
if [ $MAXN -lt ${#i} ];
then
MAXN=${#i};
fi;
done;

P=""
for i in $(seq $MAXN); do P=".$P"; done

sed "s/\$/$P/" $FILE | cut -c 1-$MAXN
[/code:1:376ac91033]

Azt szertném, hogy a sed egy bizonyos szó után n darab "valamit" tegyen.
Tehát valami hasonló kellene
echo "blablabla" | sed s/$/"valami"\{n}\/ de ez ugye nem jó...
Segítsetek légyszives.
szerk: a "-r" opcióval sem megy

[quote:3929f673b4="gsimon"]Jézusom, de túlkombináltam! Kit érdekel, hogy mennyit kell hozzáfűzni az adott sorhoz: hozzáfűzűnk a leghosszabb sornyit és levágjuk az n. pozíciónál :) !
Az elején egyszer meg kell határozni a leghosszabb sor méretét ill. össze kell rakni ennyi '.' karaktert egy stringgé, ezt nem ússzuk meg, de onnantól már nem kell soronként rágnunk a file-t:
[code:1:3929f673b4]
#!/bin/bash

FILE="pad2.sh";
IFS=$'\n';

MAXN=0
for i in $(<$FILE);
do
if [ $MAXN -lt ${#i} ];
then
MAXN=${#i};
fi;
done;

P=""
for i in $(seq $MAXN); do P=".$P"; done

sed "s/\$/$P/" $FILE | cut -c 1-$MAXN
[/code:1:3929f673b4]

köszi. ez gyors :D

[quote:369c019c45="gsimon"]Jézusom, de túlkombináltam! Kit érdekel, hogy mennyit kell hozzáfűzni az adott sorhoz: hozzáfűzűnk a leghosszabb sornyit és levágjuk az n. pozíciónál :) !
Az elején egyszer meg kell határozni a leghosszabb sor méretét ill. össze kell rakni ennyi '.' karaktert egy stringgé, ezt nem ússzuk meg, de onnantól már nem kell soronként rágnunk a file-t:
[code:1:369c019c45]
#!/bin/bash

FILE="pad2.sh";
IFS=$'\n';

MAXN=0
for i in $(<$FILE);
do
if [ $MAXN -lt ${#i} ];
then
MAXN=${#i};
fi;
done;
[/code:1:369c019c45]

E helyett en a [code:1:369c019c45]MAXN=`wc -L $FILE | sed -e's/ .*//'`[/code:1:369c019c45] hasznalnam. :-)'[quote:369c019c45="gsimon"][code:1:369c019c45]
P=""
for i in $(seq $MAXN); do P=".$P"; done
[/code:1:369c019c45]

E helyett meg ezt ;-)[code:1:369c019c45]P=`echo -n $'\t' | expand -t $MAXN | sed -e's/ /\./g'`[/code:1:369c019c45][quote:369c019c45="gsimon"][code:1:369c019c45]

sed "s/\$/$P/" $FILE | cut -c 1-$MAXN
[/code:1:369c019c45]

Szoval az en verziom ez lenne:
[code:1:369c019c45]#!/bin/bash
FILE="pad2.sh"
P="X"

MAXN=`wc -L $FILE | sed -e's/ .*//'`
P=`echo -n $'\t' | expand -t $MAXN | sed -e's/ /x/g'`
sed "s/\$/$P/" $FILE | cut -c 1-$MAXN
[/code:1:369c019c45]

Zsiraf

u.i.: amugy, ha kisse specialisabb az eseted, akkor a kovetkezot is kiprobalhatod:
1. peremfeltetel: nincs TAB (0x09) a file-ban
2. space-el akarod feltolteni a sorok veget
3. nincs ures sor a fileban
[code:1:369c019c45]n=`wc -L filename | sed -e's/ .*//'`; sed -re's/$/\t/' filename | expand -t 1,$n | sed -e's/\(.\{'$n'\}\).*/\1/'[/code:1:369c019c45]

B varians: van ures sor a fileban:
[code:1:369c019c45]n=`wc -L filename | sed -e's/ .*//'`; sed -re's/^$/ /; s/$/\t/' filename | expand -t 1,$n | sed -e's/\(.\{'$n'\}\).*/\1/'[/code:1:369c019c45]

No, de felre a trefat a ma hajnali ajanlatom a kovetkezo:
[code:1:369c019c45]n=$((`wc -L filename | sed 's/ .*//'`-1));sed -e :a -e 's/^.\{0,'$n'\}$/&x/;ta' filename[/code:1:369c019c45] itt az 'x' a padding karakter :P

[quote:d9ba6cffa1="Hunter"]Azt szertném, hogy a sed egy bizonyos szó után n darab "valamit" tegyen.
Tehát valami hasonló kellene
echo "blablabla" | sed s/$/"valami"\{n}\/ de ez ugye nem jó...

Persze hogy nem jo, mivel minimum megcserelted a } a \ -el :-) Azutan az
'n' az mi lenne? egy fix szam, vagy valami parameter???[quote:d9ba6cffa1="Hunter"]
Segítsetek légyszives.
szerk: a "-r" opcióval sem megy

Csak ugy altalaban szeretnem felhivni a figyelmedet, hogy a regexp-ek eseten, a
csere sztringben nem ertelmezhetoek a pattern jokerei (pl. {n,m}, + * ...)
Tehat pl. s/a/b+/g nem fogja a sorban az osszes a-t 1-nel tobb b-re cserelni :lol: :lol:

Zsiraf

p.s.: szoval a lenyeg, hogy honnet az 'n'?
p.s.2: ha param, akkor legegyszerubb sed-en kivulrol megoldani, habar sed-ben is lehet
szamolos script-et irni :-)