szeretnem megvalositani a fenti mukodest. kriteriumok: sor athelyezese a file vegere nem engedheto meg, az eredeti sornak kell modosulnia. nem szeretnek a file sorain egyenkent vegigmenni for
ciklussal mert az lassu scriptbol nagyobb file-ok eseten. gondoltam head
es tail
hasznalatara, de nincs ennel valamilyen egyszerubb/elegansabb megoldas?
Udv Zoli
- 1127 megtekintés
Hozzászólások
sed nem jó?
- A hozzászóláshoz be kell jelentkezni
eddig a szintaxisanak atlathatatlansaga szamomra es a ra hozott peldak bonyolultsaga tartott vissza a hasznalatatol
Udv Zoli
- A hozzászóláshoz be kell jelentkezni
akkor perl, php, python, java, c/c++, stb.
A szövegfájlban nincsenek mutatók a sorok kezdőpozíciójára, így közvetlenül nem tudsz odaugrani a keresett sorhoz, de ez nem is nagy gond, mert ha változik a sor hossza a módosítás után, akkor az egész fájlt kell másolnod.
Az adott sort csak úgy tudod megtalálni, ha:
a) sorszám ismert: addig mindent beolvasol és a sorelválasztó jeleket (LF, CR/LF) számolod
b) a sor tartalma alapján (pl. regexp).
Mindegyik program ezen két megoldás közül valamelyiket használja.
Szerintem legkönnyebben a perl-lel fogsz boldogulni, ha megmondod, hogy mi alapján dől el, hogy melyik sort módosítod, akkor segítek.
Mellesleg a sed tényleg nagyon bonyolult, de az nem is egy sor módosítására való, arra inkább awk, de a perl még annál is általánosabb.
- A hozzászóláshoz be kell jelentkezni
egy konfig file elemet szeretnem modositani ugy, hogy az iraskepe ne essen szet ha megnyitom szerkesztesre
pl.
kapcsolo=1
itt az egyest szeretnem modositani 0-ra, nyilvan a kapcsolora rakereshetek, de majd holnap reggel
Jo ejszakat :-)
- A hozzászóláshoz be kell jelentkezni
Sima ügy, awk-ban, perlben kisujjgyakorlat szintű dolog. Holnap megnézem a perl könyvben, hogy pontosan hogyan is van (egyszer nekiálltam a perlnek, de nem használom).
- A hozzászóláshoz be kell jelentkezni
perl-t nem szeretnek hasznalni, az awk szimpatikusabnak tunik
Udv Zoli
- A hozzászóláshoz be kell jelentkezni
Ha szabad beledumálni: jobban jársz, ha nem kerülöd a perlt.
Rengeteg, egyébként macerás dolgot lehet vele megoldani.
---------------------------------------------------
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni
ilyen egyszerű példánál a perl és az awk kód között nagyjából annyi különbség van, hogy perl esetén neked kell kézzel beírnod azt a nagyon bonyolult ciklust, amit az awk mindenképp beépít:
while (<>)
{
...
}
Ez annyit csinál, hogy a parancssroban lévő összes fájlt, illetve az stdin-t sorról sorra beolvassa.
- A hozzászóláshoz be kell jelentkezni
cat file.txt | awk -F "=" '{if ($1=="kapcsolo") print $1"=0"; else print; }'
- A hozzászóláshoz be kell jelentkezni
Nos ez a resz mukodik, de ez csak a kapcsolo allapotat irja ki, nem modositja a file-ban azt
Udv Zoli
- A hozzászóláshoz be kell jelentkezni
Nos mar a modositas is jo, de peldaul ez hogy muxik egy xml fileban vagy egy samba stilusu config fileban, amikor csak egy adott bekezdesben kell modositani a kapcsolot?
Udv Zoli
- A hozzászóláshoz be kell jelentkezni
meg valami ilyen:
sed 's/\(kapcsolo\)\=\(1\)/\1=0/g'
asszem
- A hozzászóláshoz be kell jelentkezni
zumy! És mi van akkor, ha történetesen van egy
wwwkapcsolo=10
sor is a file-ban?
Alaposabban átgondolva nem is tudok korrekt megoldást így hirtelen.
Illetve ha feltételezzük, hogy biztosan a sor elején kezdődik a paraméter, belül biztosan nincs szóköz és a sor végére sincs semmi egyéb írva, akkor ez jöhet még szóba:
cat param.file | sed -e 's/^kapcsolo=1$/kapcsolo=0/' >param.file.new && mv param.file.new param.file
Ha valaki tudja, hogy mi a módja a stdin felülírásának egy menetben, annak roppant hálás lennék.
---------------------------------------------------
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni
És mi van akkor, ha történetesen van egy
wwwkapcsolo=10
sor is a file-ban?
Úgy kell megadni a feltételt hogy csak arra illeszkedjen
ami szándékunkban áll...
pl.
^[[:space:]]*kapcsolo[[:space:]]*=[[:space:]]*ertek[[:space:]]*$
A reguláris kifejezéseknek pont az a lényege hogy nagyszerű
illesztési mintákat lehet készíteni vele.
Alaposabban átgondolva nem is tudok korrekt megoldást így hirtelen.
Illetve ha feltételezzük, hogy biztosan a sor elején kezdődik a paraméter, belül biztosan nincs szóköz és a sor végére sincs semmi egyéb írva,
Jól megadott illesztési mintával ez nem lehet gond.
--
maszili
- A hozzászóláshoz be kell jelentkezni
Ha neked bonyolult a sed szintaxisa:
sed '3275 s/bonyolult/egyszeru/g' filebe >fileki
akkor keress mas szakmat :-)
Zsiraf
P.s.: persze, lehet, hogy ez bonyolultabbnak tunik, mint alant az awk program... Dehat kinek mi tetszik...
- A hozzászóláshoz be kell jelentkezni
a sed tipikusan az a nyelv, amit eloszor peldak alapjan kell megismerni ;)
persze a regex elozetes ismerete _szukseges_, pont mint a perl/awk/grep/... hasznalatahoz.
Anr - http://andrej.initon.hu
- A hozzászóláshoz be kell jelentkezni
cat file.txt | awk '{i++; if (i==1234) print "hinnye"; else print; }'
- A hozzászóláshoz be kell jelentkezni
> cat temp.txt
1
2
3
negy
5
> sed -i '4s/negy/4/' temp.txt
> cat temp.txt 1
2
3
4
5
sed -i (mint helyben szerkesztés) '4(edik soron csak es kizarolag)s(csere)/mit/mire/' filenev.
Mi a bonyolult ebben?
- A hozzászóláshoz be kell jelentkezni
amennyiben tudod a sornak a szamat, ugy van egy nagyon egyszeru megoldas annak a sornak a kicserelesere:
ed <allomany>
es a kovetkezo parancsokat akarod kiadni (akar ra is kuldheted az ed standard bemenetere)
<sorszam>
s/.*/<uj tartalom>/
wq
a sorszamot ha nem tudod ugy lehet konnyen megszerezni, hogy
grep -n
Udv, Hijaszu
- A hozzászóláshoz be kell jelentkezni
Van egy program, amit kifejezetten szovegfileok editalasara talaltak ki, es nagyon jo. Ugy hivjak, hogy vim. Es van ennek egy scriptekben nagyon jol hasznalhato parancsori valtozoja, az ex.
En szinte minden txt filet manipulalo scriptemben ezt hasznalom.
- A hozzászóláshoz be kell jelentkezni