Pár (tíz)ezer html fájlt meg kellene dolgoznom úgy, hogy töröljek belőlük egy szövegblokkot.
A törlendő szövegblokk
- többsoros,
- ugyanazzal a kezdő mintázattal indul, de nem szükségszerűen sor elején
- ugyanazzal a záró mintázattal végződik, szintén nem feltétlenül sor végén
Van erre valami egyszerű és frappáns sed/awk parancs, vagy egy bash szkriptet kellene összekalapálnom rá?
- 3185 megtekintés
Hozzászólások
OK, közben kiötlöttem egy megoldást, ami bizonyos megszorítások mellett működik (a "masodik" és "negyedik" szavak közötti részt törli, tekintet nélkül a sorvége karakterekre):
echo "elsomasodikharmadik"$'\n'"almakorte""dionegyedikotodik" | sed -e 's/masodik/§/' -e 's/negyedik/§/' | awk 'BEGIN {RS="ß"; FS="§"}{print $1 $3}'
A megszorítások:
- a fájlokban ne legyen "sarfesz" és § jel,
- csak egy törlendő blokk legyen mindegyikben
- nem tudom van-e korlát, és mekkora egy awk változóban tárolható szöveg méretére?
Egyelőre úgy tűnik, hogy megvan a megoldás, de a megszorítások teljesülését még csekkolnom kell.
---
If you have money, use Windows!
However, if you also have a brain, use Linux!
- A hozzászóláshoz be kell jelentkezni
perl-ben meg lehet csinálni, hogy a teljes textfile-t egyetlen stringként kezelje. Sajnos úgy 5-6 éve bányásztam ki a doksiból, azóta se volt rá szükségem, úgyhogy ennyi az össz emlékem.
Valami rémlik, hogy van egy spec változó ami a sorvég karaktert definiálja, ebbe kell üres stringet tenni.
Talán betéved valaki, aki pontosan is tudja.
--------------
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni
Na megvan:
perl -e 'undef $/; while(<>){s/ketto(\n|.)*negy//m; print $_,"-";};'
Azt hiszem, a -i kapcsolóval lehet elérni, hogy a cserék bekerüljenek az input file-ba is.
--------------
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni
find /foo/bar -type f -name bar | xargs perl -pi -e 's/foo/bar/'
t
- A hozzászóláshoz be kell jelentkezni
Szerintem ez így kevés! (jó, a print-et nem kell beleírni)
;-)
--------------
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni
find /foo/bar -type f -name '*html' -print0|xargs -0 perl -pi.bak -e 's/masodik.*negyedik//s'
features:
- a filenevekben lehet minden unix-os gonoszsag (space,',",...)
- s///s egy sornak tekinti a filet, ha tobb van a negyedik stringbol, akkor az utolso negyedik stringig kivesz mindent.
- helyben editalja a filekat, de keszul .bak
Anr - http://andrej.initon.hu
- A hozzászóláshoz be kell jelentkezni
Na megint tanultam valamit.
Pedig direkt végignéztem a kezem ügyébe akadó perlre manualt mielőtt írni kezdtem. :)
--------------
Fel! Támadunk!
- A hozzászóláshoz be kell jelentkezni
sed -e '/masodik/,/negyedik/ d' akarmi...
Zsiraf
p.s.: megszoritas, hogy a teljes sort torli.. tehat az egesz sort ahol a 'masodik' illetve 'negyedik' szoveget megtalalja
- A hozzászóláshoz be kell jelentkezni
Ja, hogy ez fontos, akkor meg inkabb igy :-)
cat file | sed -e 's/\(.*\)\(harmadik\)/\1\n\2/; s/\(negyedik\)\(.*\)/\1\n\2/' | sed -e '/harmadik/,/negyedik/ d'
Zsiraf
- A hozzászóláshoz be kell jelentkezni
Ez a tisztán sed-es megoldás valóban szimpatikus (talán azért, mert a perl-hez még annyit sem értek, mint a sed-hez).
Igaz benne hagy egy plusz \n-t, de azt hiszem ez html fájloknál nem gond. :-)
---
If you have money, use Windows!
However, if you also have a brain, use Linux!
- A hozzászóláshoz be kell jelentkezni