grep tex forráskódban

Fórumok

Sziasztok!

Van néhány könyvtáram, bennük néhány száz .tex forráskódot tartalmazó file. Ezekben szeretnék kereséseket végrehajtani oly módon, hogy a grep figyelmen kívül hagyja a vezérlőkaraktereket (\#&%\{}- stb.) A preambulumban nincs értelmes szó, tehát ott értelemszerűen nem lesz találat.
Megoldható ez szerintetek?

Azt szeretnémelérni, hogy legyen egy kimenetem, amiben a fájlok neve is szerepel, amiben találat keletkezett.

Ilyen alaposan nem értek a BASH-hoz, elképzelhető, hogy a grep kevés ehhez. Szerintetek merre induljak el?

(mc-ben F9-c-f után panelize -- és megoldódott, de mindenképpen scripttel szeretném ugyanezt sajnos...)

Hozzászólások

Így szoktam az ilyesmit:

find . -type f -name "*tex" | xargs grep eztkeresed | sed -e 's/[vezérlőkarakterek]//g'

"A megoldásra kell koncentrálni nem a problémára."

Szerkesztve: 2020. 04. 15., sze – 13:19

A TeX elég trükkös tud lenni, bele lehet futni sok csúnyaságba. Rögtön az ékezetes karaktereknél a régi \H{o} = ő, vagy \`\i{} = í  jelöléseknél ha a parancsokat kukázod, akkor a szavakat is buktad. Ha vegyes szerzőktől vannak a fájlok, akkor biztosabb, ha lefordítod, aztán pdf2txt-vel csinálsz belőle text fájlt és abban keresel.

Pontosabban a text fájlokban érdemes még a kötőjel-sorvége mintákat kitörölni, hogy az elválasztott szavakat is megtaláld. Ha meg van fejléc-lábléc, akkor a lap utolsó sorának a végén elválasztott szavakat összeszedni még izgalmasabb kihívás...

A tex forrásnál maradva alábbival próbálkoznék:
 

find . -name "*.tex" | while read f; do awk 'i>0{print}$0~/\\begin\{document\}/{i=1}' $f | sed 's/\\[a-zA-Z*\]*\([{ ]\)/\1/g' | tr -d "vezerlokarakterek"| grep minta | awk '{print "'$f':"$0}'; done

 

A find megkeresi a tex fájlokat
Végigmegy rajtuk egy while ciklus
Az awk eldobálja a \begin{document} előtti részt.
A sed kidobálja \parancs a \parancs{  \parancs* \parancs*{  részeket, sőt a \parancs\parancs -csal is elbír.
A td-vel kidobálhatod a további fölösleges karaktereket,
a grep meg kiírja a találatokat
a végső awk meg kiírja a találatok elé a fájlnevet

Ha a fájlnevek csúnyák (szóközök és egyéb érdekességek), akkor persze még egy kicsit finomítani kell.

Pontosítom a kérdésemet.

Minden file az én írásom,melyben vannak olyan szavak, melyeket pl. \emph{így} írtam le. Néhol használok csak repülőékezeteket. Szóval az lenne a legjobb, ha a szokásos formázási karaktereket (miont az emph esetén) kihagyná a keresés.

Van ilyen is, amikor egy szót így írok le: szük\-sé\-ges-e (most ez nem konkrét példa, csak a vezérlőkarakterek miatt írtamle ezt)

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

Azokat a szavakat, amelyeket a LaTeX rosszul választ el, vagy elválasztás szempontjából valamiért speciálisak, a

\hyphenation{word list}

paranccsal külön is megadhatod, és akkor nem kell a szövegbeli előfordulásában beszúrni a "-" karaktert az elválasztási helyekre. Például

\hyphenation{szük-sé-ges szük-ség-te-len}

----------
Were antimatter present, its detection would be quite simple and straightforward. The most rudimentary detector suffices: simply place it down and wait. If the detector disappears, antimatter has been discovered - get out fast!

A szükséges szót jól választja el a TeX minden trükk nélkül, viszont a szón belüli kötőjelek megakadályozzák a többi ponton való elválasztást. Vagyis a szükséges-e kifejezést csak a kötőjelnél tudja elválasztani alapból.

Az egyik megoldás erre, ha az 1.5-ös magyar.ldf-ben definiált aktív karaktert használva szükséges`-e formában szedjük. Én ezt sem szeretem, mert pont az e előtti kötőjelnél nem szeretnék elválasztást engedélyezni, és az egy szál e betűt átvinni a következő sorba, szóval én csináltam magamnak erre egy saját shorthand-et a preambulumban:

\makeatletter
\declare@shorthand{magyar}{`+}{\leavevmode\nobreak\hbox{-}\nobreak\hskip\z@skip}
\makeatother

Ezek után a szükséges`+e formában szedem, amit csak két ponton enged elválasztani:  szük - sé - ges-e.
Hasonlóan patológiai szövegekben Y`+vágás.

Szerkesztve: 2020. 05. 11., h – 19:13

Most már kiforrottabbá vált, mire is akarom ezt alkalmazni.

A TeXforráskódban a mondatvégi írásjelek utáni space meglétére szeretnék rákeresni, valamint arra, hogy minden mondat nagybetűvel kezdődik-e.

Egyelőre az alant található borzalmat sikerült megalkotnom, amely csak a mondatvégi pontokat nézi:

#!/bin/bash

find ./ -type f -name "*.tex"   | xargs grep ,[a-zA-Z0-9] |\
 sed 's/\\,/ /g' |\
 sed  's/, /, /g' |\
 sed  "s/%//g" |\
 sed  "s/\\,c/ c/g" |\
 sed  "s/\\,f/ f/g" |\
 sed  "s/\\,s/ s/g" |\
 sed  "s/\\,m/ m/g" |\
 sed  "s/\\,F/ F/g" |\
 sed  "s/\\,e/ e/g" |\
 sed  "s/textwidth,height/textwidth-height/g"
 sed  "s/\\,k/ k/g" |\
 sed  "s/\\,l/ l/g" |\
 sed  "s/,,//g"|\
 sed  "s/''//g"| xargs grep ,[a-zA-Z0-9]

 
 exit 0

Ez kidob nekem egy kimenetet,melyet fájlba írva egy editorralmár manuálisan végig tudok futni. A script borzalmasan ronda, de egy könyvtárnyi adathalmazon már sikeresen előjöttek space-kimaradások,melyeket hosszú hónapok óta még nem szúrtam ki.

Aküzdelem fő oka az,hogy néha nem képes lenyomódni rendesen a klaviatúrámon a space billentyű...

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.

mcedit,geany,texmaker, néha texstudio.

vi-t egyetemen ugyan tanultam, de agyfrészt kaptam tőle, pedig ergonomiai szempontok alapján tervezett editor.

Nem ástam bele magam, nekem már késő 50 felé...

10-féle lény van:
-- aki ismeri a bináris számrendszert,
-- és amelyik nem.