2 votes

Trouver des chaînes correspondantes dans des paragraphes

Je possède un fichier TXT avec des équations mathématiques LaTeX où un délimiteur $ unique est utilisé avant et après chaque équation en ligne.

J'aimerais trouver chacune des équations dans un paragraphe et remplacer les délimiteurs par des balises XML ouvrantes et fermantes ....

Par exemple,

Le paragraphe suivant:

Ceci est le début d'un paragraphe $première équation$ ...et voici du texte... $deuxième équation$ ...et voici plus de texte... $troisième équation$ ...et voici encore plus de texte... $quatrième équation$

devrait devenir:

Ceci est le début d'un paragraphe première équation ...et voici du texte... deuxième équation ...et voici plus de texte... troisième équation ...et voici encore plus de texte... quatrième équation

J'ai essayé les commandes sed et perl suivantes:

perl -p -e 's/(\$)(.*[^\$])(\$)/$2<\/equation>/'

Mais ces commandes aboutissent à ce que les première et dernière instances d'équations soient converties mais aucune des équations entre celles-ci:

Ceci est le début d'un paragraphe première équation$ ...et voici du texte... $deuxième équation$ ...et voici plus de texte... $troisième équation$ ...et voici encore plus de texte... $quatrième équation

J'aimerais également une solution robuste qui pourrait prendre en compte la présence d'un seul $ qui n'est pas utilisé comme délimiteur LaTeX. Par exemple,

Ceci est le début d'un paragraphe $première équation$ ...et voici du texte qui inclut un seul signe de dollar : Il a payé $2,50 pour un paquet de cigarettes... $deuxième équation$ ...et voici plus de texte... $troisième équation$ ...et voici encore plus de texte... $quatrième équation$

ne devrait pas devenir:

Ceci est le début d'un paragraphe première équation$ ...et voici du texte qui inclut un seul signe de dollar : Il a payé 2,50 pour un paquet de cigarettes... $deuxième équation$ ...et voici plus de texte... $troisième équation$ ...et voici encore plus de texte... $quatrième équation

Remarque: J'écris en Bash.

5voto

markp Points 2561

NOTE: Première partie de cette réponse se concentre uniquement sur le remplacement des paires de $; pour la demande de l'OP de ne pas remplacer les $ isolés ... voir la 2ème moitié de la réponse.


Remplacer les paires de $

Données d'exemple:

$ cat latex.txt
... $première équation$ ... $deuxième équation$ ... $troisième équation$

Une idée avec sed:

sed -E 's|\$([^$]*)\$|\1|g' latex.txt

Où:

  • -E - activer le support des regex étendus
  • \$ - trouver un $ littéral
  • ([^$]*) - [groupe de capture #1] - trouver tout ce qui n'est pas un $ littéral (dans ce cas tout ce qui est entre les paires de $)
  • \$ - trouver un $ littéral
  • \1 - remplacer la chaîne trouvée par + contenu du groupe de capture +
  • /g - répéter la recherche/remplacement autant de fois que nécessaire

Cela génère:

... première équation ... deuxième équation ... troisième équation

Gérer les $ isolés

Si les $ isolés peuvent être échappés (par ex, \$), une idée serait d'avoir sed remplacer cela par un littéral absurde, effectuer le remplacement / , puis changer le littéral absurde en \$.

Données d'exemple:

$ cat latex.txt
... $première équation$ ... $deuxième équation$ ... $troisième équation$
... $première équation$ ... \$3.50 tasse de café ... $troisième équation$

Solution originale avec sed et les nouveaux remplacements:

sed -E 's|\\\$|LITDOL|g;s|\$([^$]*)\$|\1|g;s|LITDOL|\\\$|g' latex.txt

Où nous remplaçons \$ par LITDOL (DOLlar LITéral), effectuons notre remplacement original, puis changeons LITDOL en \$.

Ce qui génère:

... première équation ... deuxième équation ... troisième équation
... première équation ... \$3.50 tasse de café ... troisième équation

3voto

stack0114106 Points 2726

Essayez ce Perl en utilisant le lookahead négatif.

$ cat joseph.txt
Ceci est le début d'un paragraphe $first équation$ ... et voici du texte qui contient un seul dollar : Il a payé $2.50 pour un paquet de cigarettes... $deuxième équation$ ... et voici plus de texte... $troisième équation$ ... et voici encore plus de texte... $quatrième équation$
$ perl -p -e 's/(\$)(?![\d.]+)(.+?)(\$)/<équation>$2<\/équation>/g' joseph.txt
Ceci est le début d'un paragraphe <équation>first equation ... et voici du texte qui contient un seul dollar : Il a payé $2.50 pour un paquet de cigarettes... <équation>second equation ... et voici plus de texte... <équation>third equation ... et voici encore plus de texte... <équation>fourth equation
$

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X