Sziasztok.
Adott 232032313^23 db txt fájl, melyek elején van egy ilyen stringelrendezés:
\lnff elsoszo innen meg jon atobbiszoveg
Az elsoszo hossza változó lehet, a többi lényegtelen, ami jön.
Cserélendő az \lnff és az elsoszo oly módon, hogy még {} használat is van:
\letf{e}{lsoszo} innen meg jon atobbiszoveg
Erre megoldottam egy pitonkódot', ami itt van:
#!/usr/bin/python
def make_atiras(mondat):
print len(mondat)
atiras_mondat = '\letf{' + mondat[6:7] + '}{' + mondat[8:len(mondat)]+ '}'
return atiras_mondat
print(make_atiras('\lnff elsoszo'))
Kérdés:
ha a fájlokban egynél több sor van, de ez a fenti sorelőfordulás mindben csak egyszer áll fenn, hogyan tudom megkérni a pythont arra, hogy az aktuális könyvtárban az összes fájlon hajtsa ezt végre?
- 1518 megtekintés
Hozzászólások
- A hozzászóláshoz be kell jelentkezni
Ha a feladathoz választod az eszközt, akkor valami ilyesmi a megoldás:
#!/usr/bin/env bash
for i in *.tex ; do
sed -i 's/\\lnff\ \([[:alpha:]]\)\([[:alpha:]]*\)/\\letf{\1}{\2}/' "$i"
done
Ha ragaszkodsz a Pythonhoz:
#!/usr/bin/env python3
import os
import sys
import re
def find_tex(folder):
matches = []
for root, dirnames, filenames in os.walk(folder):
for filename in filenames:
if filename.endswith('.tex'):
matches.append(os.path.join(root, filename))
return matches
def main(argv):
if (len(argv) == 1):
print("Directory name?")
exit(1)
else:
folder = argv[1]
p = re.compile(r'^\\lnff (?P<head>\w)(?P<tail>[\w]*)')
files = find_tex(folder)
for filename in files:
with open(filename, 'r') as tex_file:
lines = []
for line in tex_file:
lines.append(line)
with open(filename, 'w') as tex_file:
for line in lines:
tex_file.write(p.sub(r'\\letf{\g<head>}{\g<tail>}', line))
if __name__ == '__main__':
main(sys.argv)
Bár hozzáteszem, hogy Pythonul nem nagyon tudok. Tehát nem kizárt, hogy ez a megoldás sok sebből vérzik.
- A hozzászóláshoz be kell jelentkezni
Köszönöm :)
Bár nagy kínnal némi geany editor közbeiktatásával (!) megoldottam a gondot, ilyen máskor is felléphet, úgyhogy használom a kódot. Baromira sajnálom, hogy a pythonnal kiskoromban nem foglalkoztam eleget!
egyébként hogy találtad ki, hogy a fájlok *tex-ek?
---------
Különben azért folyamodtam a pythonhoz, mert awk-ban elfelejtettem a split használatát. De legjobb a sed, ott meg a reguláris kifejezéseket felejtettem el.
- A hozzászóláshoz be kell jelentkezni
„egyébként hogy találtad ki, hogy a fájlok *tex-ek?”
Nem volt nehéz: „\letf{e}{lsoszo}”
- A hozzászóláshoz be kell jelentkezni
Ha sok ilyen feladvány várható a jövőben, akkor esetleg nézz rá a perl-re vagy a ruby-ra is! A perl eredetileg ilyesmire lett kitalálva, a ruby meg úgy tudom, sokat örökölt a perl-ből is.
A pythont szeret(t)em, de szövegfeldolgozásra nem a legjobb választás.
- A hozzászóláshoz be kell jelentkezni
igen, a perl.
Azt is sajnálom, de rá fogok gerjedni ismét.
- A hozzászóláshoz be kell jelentkezni
A beolvasott sorokat fölösleges listába gyűjtögetni a feldolgozás előtt. Ahogy egyet olvastál, majd feldolgoztál, rögtön mehet az output fájlba.
--
♙♘♗♖♕♔
- A hozzászóláshoz be kell jelentkezni
Erre én is gondoltam, de az output fájl és az input fájl megegyezik. Mivel nem vagyok rutinos a Pythonban, így ez volt az egyszerűbb megoldás. De ha a helyben való szerkesztésere van egyszerű megoldás, akkor az érdekelne. Mondjuk egy átmeneti fájllal meg tudtam volna oldani, de arra tippeltem, hogy az input fájlok nem túl hosszúak, így nem sokat nyernék a dologgal.
- A hozzászóláshoz be kell jelentkezni
Azért gyakorlásként így is megcsináltam. :-)
- A hozzászóláshoz be kell jelentkezni
>>Pythonul nem nagyon tudok
Azért mégis elég sokat, amint látszik:-)
A fájl beolvasását, mivel nincs soronkénti feldolgozás, lehet így is:
with open(filename, 'r') as tex_file:
lines= tex_file.readlines()
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Eddig még nem álltam neki a Python módszeres megtanulásának. Mindig a dokumentáció éppen aktuális részét olvasom csak el, így vannak hiányosságaim. Mint most is kiderült. :-)
- A hozzászóláshoz be kell jelentkezni