Question de flemmard

Coucou.
J’ai besoin de faire régulièrement un rechercher/remplacer dans fichieramodifier.txt, en prenant la liste des remplacements à faire depuis un csv avec 2 colonnes <texte recherché>;.

J’ai essayé de jouer avec sed et cut pour faire ça, mais je suis grave rouillé et trés fatigué.

Quelqu’un saurait monguer ça élégament en une instruction, en bash,perl ou autre que je puisse mettre ça facile en cron ?

Ayez pitié d’un pauvre flemmard… snif snif.

Le fichier csv serait bien, avec un exemple de ce que tu veux faire.

amodifier.txt:

ceci est un bla bla.
j’y parle de n’importe quoi.
je veux y faire une série de rechercher/remplacer

listederemplacementsaeffectuer.csv:

bla bla,pipo
n’importe quoi,tout et de rien

mais c’est plus aussi urgent, j’ai déjà un truc qui marche:

while read line; do
SEARCH=echo $line | cut -d',' -f1
REPLACE=echo $line | cut -d',' -f2
sed -r “s/$SEARCH/$REPLACE/g” -i amodifier.txt
done < listederemplacementsaeffectuer.csv

donc maintenant, c’est plus qu’une question d’élégance pour faire ça en une instruction plus compacte.

Difficile de faire ça en une instruction vu que tu dois utiliser deux fichiers pour un rechercher/remplacer, du moins avec sed.
Sauf si un barbu passe par ici et prouve le contraire. :slight_smile:

Je pense qu’on peut faire ça en une ligne en Perl, j’essaie de développer un petit traducteur Français->Patois normand (on s’amuse comme on peut :slight_smile: ) qui utiliserait ce principe. Je débute encore en Perl, mais dès que j’ai trouvé comment faire ça de façon élégante, je donne des nouvelles !

salut,

$ cat fichier.fic ceci est un bla bla. j'y parle de n'importe quoi. je veux y faire une série de rechercher/remplacer $ cat replace.fic bla bla,pipo n'importe quoi,tout et de rien $ sed 's/^/s\//; s/,/\//; s/$/\//' replace.fic s/bla bla/pipo/ s/n'importe quoi/tout et de rien/ $ sed "$(sed 's/^/s\//; s/,/\//; s/$/\//' replace.fic)" fichier.fic ceci est un pipo. j'y parle de tout et de rien. je veux y faire une série de rechercher/remplacer

et le premier qui me traite de barbu, je lui fait exploser le fondement ! :laughing:

3 J'aime

:open_mouth:

Ça dépend, tu es barbu ?

Juste pour l’exercice. Solution avec un awk oneliner en un seul process (la solution sed plus haut, deux process).

awk -F "," 'NR<=FNR{a[$1]=$2;next}{for(i in a)gsub(i,a[i])}1' replace amodifier

Pour les tout, tout gros fichiers, utiliser mawk (interpréteur en code-byte), plus rapide. Ou carrément en C/C++/Go.

1 J'aime

Ça pique quand même un peu les yeux :cry:.

Oui, un peut comme une de mes commandes en sed (dont je peux pas donner le contenu étant donné que j’ai changé de langage de programmation sur ce projet à cause de ce truc) contenait une série de sept anti-slashes consécutif. Je n’ai jamais compris pourquoi il en fallait sept et je n’ai trouvé cette valeur que de façon empirique.
C’était pour insérer un échappement (\033) pour une coloration de terminal, ça donnait un truc du genre sed 's/^\(.*\)$/\\\\\\\033[5m\1/', mais ça ne jurait pas vraiment avec le reste du code.