file adott soranak modositasa scriptbol

Fórumok

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

Hozzászólások

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.

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.

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!


É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

cat file.txt | awk '{i++; if (i==1234) print "hinnye"; else print; }'

> 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?

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

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.