web-dev-qa-db-fra.com

Remplacement de certaines commandes par des parenthèses / crochets tout en conservant le contenu (CLI)

J'ai un fichier plain text avec LaTeX commandes telles que \hspace{5cm}. Pour convertir ce fichier en .odt, certaines de mes commandes personnalisées ne sont pas converties correctement. Je souhaite donc automatiquement rechercher et remplacer des commandes spécifiques tout en conservant le contenu des crochets (ce qui signifie que je souhaite conserver la plupart des commandes et en supprimer quelques-unes). Je sais que je peux simplement ouvrir gedit et effectuer le remplacement à la main, mais il s’agit d’un script de remplacement répété et automatique.

J'ai déjà cherché cela, mais jusqu'à présent, je n'ai trouvé que des réponses pour supprimer les crochets tout en conservant le contenu (cf. ici , ici)). J'ai aussi regardé quelques introductions à sed (par exemple ici ou ici ) sans succès.

Exemple:

This is my \textbf{text} where there are about \prc{5} commands, i.e. \mErrRange{30}{20}{m}.

Donc, comme il s’agit d’un pourcentage et d’une plage d’erreur, je souhaite supprimer la commande & les accolades et obtenir un résultat similaire (en conservant la commande \textbf{...}):

This is my \textbf{text} where there are 5 % commands, i.e. 30 ± 20 m.

Ce que j'ai essayé jusqu'à présent:

Différentes façons d'utiliser sed, comme:

sed -i -e 's/\\prc{\(.*\)}/\1%/g' hello.txt

Cela me donne déjà:

This is my \textbf{text} where there are about 5} commands, i.e. \mErrRange{30}{20}{m%.

(Remplace la dernière accolade de la ligne, mais laisse l'autre à la place.)

Alors, maintenant, je ne sais pas comment continuer avec ça. Peut-être que je devrais utiliser un autre outil au lieu de sed?! Je suis heureux de toute suggestion sous Ubuntu & dans le terminal sans installer trop.

1
bamphe

Voici un moyen:

sed 's/\\prc{\([^}]*\)}/\1 %/g'

Cela va capturer tout ce qui se trouve entre les crochets après \prc et le sauvegarder dans le groupe 1, vous pouvez l’utiliser pour remplacer la commande par le contenu des crochets. [^}]* prend simplement tout sauf le crochet de fermeture ici. g signifie “globalement” et signifie qu'il substituera toutes les occurrences du motif dans la ligne au lieu de la première - vous voudrez cela pour chaque expression de votre cas.

Quant à l’autre, il suffit d’utiliser plusieurs groupes:

sed 's/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g'

Vous pouvez combiner autant d'expressions que vous le souhaitez, mais cela devient difficile à comprendre. Je recommande d'écrire un script sed avec une expression par ligne, comme ceci:

#!/bin/sed -f
s/\\prc{\([^}]*\)}/\1 %/g
s/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g

Enregistrez-le comme par exemple script.sed, rendez-le exécutable avec chmod +x /path/to/script.sed et exécutez-le avec /path/to/script.sed.

Exemple d'exécution

$ /path/to/script.sed <hello.txt
This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

J'ai laissé le Shell ouvrir les fichiers d'entrée aussi souvent que possible, d'où <hello.txt au lieu de simplement hello.txt (qui fonctionne aussi!). Si vous êtes intéressé par ce que cela a exactement, je recommande cette réponse sur unix.SE .

1
dessert