Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 11/09/2017, à 10:42

snake57

[résolu] Bash rechercher/remplacer dans un document texte

Bonjour,

J'ai une petite question (sans doute un cas d'école pour qui s'y connait).

J'ai un document texte qui par endroit contient le texte suivant : "EQUIP013.B16385"

Je voudrais pouvoir écrire un petit script qui permet de faire les choses suivantes :
- Rechercher tous les endroits, ou se trouve l'expression ci dessus.
- Extraire le chiffre "16385" qui lui peut changer.
- Diviser ce chiffre par 16 et garder le résultat et le reste (16385/16 = 1024 reste 1)
- Remplacer le texte initialement trouvé "EQUIP013.B16385" par "EQUIP013.W1024.1"


J'ai déjà trouver la regex qui permet de trouver ma chaîne dans mon texte :

((EQUIP013.)B([0-9]*))

Du coup on a dans $2 le début de la chaîne : "EQUIP013." et dans $3 le chiffre sur lequel appliquer le calcul "16385"

Donc j'arrive à trouver ce que je veux mais pas à faire le remplacement.

Si quelqu’un peut m'aider, ce serait cool smile

Merci

Dernière modification par snake57 (Le 16/09/2017, à 01:15)


Toshiba Satellite L775-11N

Hors ligne

#2 Le 11/09/2017, à 11:23

kholo

Re : [résolu] Bash rechercher/remplacer dans un document texte

salut,
je viens justement de mettre un petit tuto ici
ça devrait te donner des idées et nous donner un début de code qu'on pourra corriger et t'aider à améliorer.

Hors ligne

#3 Le 11/09/2017, à 12:25

credenhill

Re : [résolu] Bash rechercher/remplacer dans un document texte

hello
en exécutant bc dans une substitution sed

$ sed -r 's+(EQUIP013).B([0-9]*)+echo "print \\"\1.W\\", \2/16, \\".\\", \2%16 " | bc+e' <<< "EQUIP013.B16385"
EQUIP013.W1024.1

Dernière modification par credenhill (Le 11/09/2017, à 13:04)

Hors ligne

#4 Le 11/09/2017, à 23:22

snake57

Re : [résolu] Bash rechercher/remplacer dans un document texte

Credenhill peut tu m'expliquer ta ligne de commande stp.

Je n'arrive pas à la comprendre et donc à l'adapter à mon besoin.

Déjà le sed tel que je le connais devrait être de la forme 's/texteAchercher/texteDEremplacement/' hors la je ne retrouve pas cette structure et je suis un peu perdu.
Pareil pour le echo et le print, j'ai du mal a comprendre leur role ici.
Et les + que l'on trouve dans le sed, que font-ils?


Toshiba Satellite L775-11N

Hors ligne

#5 Le 11/09/2017, à 23:55

cqfd93

Re : [résolu] Bash rechercher/remplacer dans un document texte

Bonjour,

Les + servent de séparateurs à la place des / habituels pour pouvoir utiliser le / pour la division par 16. Je pense que tu peux utiliser n'importe quoi (ou presque) comme séparateur mais c'est bien plus lisible avec /.

En ligne

#6 Le 12/09/2017, à 08:15

snake57

Re : [résolu] Bash rechercher/remplacer dans un document texte

J'ai beau essayé mais dès que j'essaie d'adapter la ligne pour qu'elle traite tout mon fichier cela ne marche plus :

sed -r 's+(EQUIP013).B([0-9]*)+echo "print \\"\1.W\\", \2/16, \\".\\", \2%16 " | bc+e' taglist.txt > taglist_bis.txt

J'obtiens les erreurs suivantes :

...
sh: 1: cannot open TAG: No such file
sh: 1: "EQUIP013.W",: not found
sh: 1: cannot open TAG: No such file
sh: 1: "EQUIP013.W",: not found
sh: 1: cannot open TAG: No such file
sh: 1: "EQUIP013.W",: not found
sh: 1: cannot open TAG: No such file
sh: 1: "EQUIP013.W",: not found
...

Toshiba Satellite L775-11N

Hors ligne

#7 Le 12/09/2017, à 10:27

pingouinux

Re : [résolu] Bash rechercher/remplacer dans un document texte

Bonjour,
@snake57 #6 :
Les lignes de ton fichier taglist.txt contiennent vraisemblablement du texte avant ou après celui que tu recherches. Il faut dans ce cas adapter ta commande.

Hors ligne

#8 Le 12/09/2017, à 10:45

snake57

Re : [résolu] Bash rechercher/remplacer dans un document texte

Ah ça oui en effet, j'ai un gros document txt avec plein de chose dedans et il faut pouvoir rechercher/remplacer sans modifier le reste.

Comment je l'adapte la commande?


Toshiba Satellite L775-11N

Hors ligne

#9 Le 12/09/2017, à 11:01

pingouinux

Re : [résolu] Bash rechercher/remplacer dans un document texte

Essaye ceci (c'est une adaptation de l'astucieuse commande de credenhill en #3) :

sed -r 's+(.*)(EQUIP013).B([0-9]*)(.*)+echo "print \\"\1\2.W\\", \3/16, \\".\\", \3%16, \\"\4\\" " | bc+e' taglist.txt > taglist_bis.txt

Hors ligne

#10 Le 12/09/2017, à 11:07

credenhill

Re : [résolu] Bash rechercher/remplacer dans un document texte

montre un bout du fichier taglist.txt

Hors ligne

#11 Le 12/09/2017, à 12:38

snake57

Re : [résolu] Bash rechercher/remplacer dans un document texte

La dernière commande donné par pingouinux fonctionne bien. Par contre j'ai un dernier petit soucis...

Je me suis rendu compte que j'avais un décalage.

il faudrait que je puisse ajouter ou soustraire une valeur au résultat de la division.
j'ai éssayer de remplacer ceci

, \3/16,

par ça

, \3/16-4,

ou ca

, (\3/16)-4,

ou ca

, [\3/16]-4,

Mais ca ne veux pas marcher.

Si qqn peut me faire cette dernière chose ce serait tip top smile


Toshiba Satellite L775-11N

Hors ligne

#12 Le 12/09/2017, à 12:47

pingouinux

Re : [résolu] Bash rechercher/remplacer dans un document texte

Es-tu sûr d'avoir essayé ?

sed -r 's+(.*)(EQUIP013).B([0-9]*)(.*)+echo "print \\"\1\2.W\\", \3/16-4, \\".\\", \3%16, \\"\4\\" " | bc+e' taglist.txt > taglist_bis.txt

Hors ligne

#13 Le 12/09/2017, à 13:00

Watael

Re : [résolu] Bash rechercher/remplacer dans un document texte

vous voulez pas faire ça en awk ?
je veux dire : traiter tout le fichier en awk, sans shell.
ce serait quand même plus clair !

ou alors en full bash, parce que le shell peut aussi faire de l'arithmétique sur les entiers (uniquement).

snakes57, tu peux nous donner un exemple de ton fichier, s'il te plaît, qu'on ait quelque chose sur quoi tester nos commandes.


eval, c'est mal.

Hors ligne

#14 Le 12/09/2017, à 13:17

snake57

Re : [résolu] Bash rechercher/remplacer dans un document texte

Voici un extrait :

<ackaudiofile/>
<acktextfile/>
<setactionlist>
<action type="0" actionid="1" flags="00000000" param=""/>
</setactionlist>
<resetactionlist/>
<ackactionlist/>
</TAG>
<TAG id="1014" name="\\SRV\APPLICOM.OPCServer.1\EQUIP013.B16385">
<local>0</local>
<lastchange>2015-11-09T09:04:02</lastchange>
<name/>

Je viens d'ailleurs de remarquer que la commande M'enlève les " et les \
Pas cool sad

Pingouilinux oui j'avais éssayé sans succès :

, \3/16-4,

Mais j'ai trouvé, il faut ajouter des espace :

, \3 /16 -4,

Dernière modification par snake57 (Le 12/09/2017, à 13:20)


Toshiba Satellite L775-11N

Hors ligne

#15 Le 12/09/2017, à 16:24

pingouinux

Re : [résolu] Bash rechercher/remplacer dans un document texte

Voici le script python snake.py, moins concis, mais plus adaptable si tu changes les spécifications.

#!/usr/bin/env python
import re, sys
fichin=sys.argv[1]
fichout=sys.argv[2]

reg=re.compile('(.*EQUIP013\.)B([0-9]+)(.*)',re.S)
with open(fichin,'r') as f, open(fichout,'w') as g:
   for lig in f:
      k=reg.search(lig)
      if k:
         q,r=divmod(int(k.group(2)),16)
         lig="%sW%d.%d%s"%(k.group(1),q-4,r,k.group(3))
      g.write(lig)

À lancer ainsi :

./snake.py taglist.txt taglist_bis.txt

Hors ligne

#16 Le 12/09/2017, à 16:44

Watael

Re : [résolu] Bash rechercher/remplacer dans un document texte

allez, en full bash :

while read -r line; do [[ $line =~ ((EQUIP013.)B([0-9]*)) ]] && { k="${BASH_REMATCH[2]}"; n="${BASH_REMATCH[3]}"; line=${line//${BASH_REMATCH[1]}/${k}W$((n/16)).$((n%16))};}; echo "$line"; done < extrait.txt 
<ackaudiofile/>
<acktextfile/>
<setactionlist>
<action type="0" actionid="1" flags="00000000" param=""/>
</setactionlist>
<resetactionlist/>
<ackactionlist/>
</TAG>
<TAG id="1014" name="\\SRV\APPLICOM.OPCServer.1\EQUIP013.W1024.1">
<local>0</local>
<lastchange>2015-11-09T09:04:02</lastchange>
<name/>

Dernière modification par Watael (Le 12/09/2017, à 18:10)


eval, c'est mal.

Hors ligne

#17 Le 12/09/2017, à 17:55

pingouinux

Re : [résolu] Bash rechercher/remplacer dans un document texte

@Watael #16 : Il semble que la définition de la variable rpl soit passée à l'as

Hors ligne

#18 Le 12/09/2017, à 18:10

Watael

Re : [résolu] Bash rechercher/remplacer dans un document texte

en effet, j'ai fait une édition, mais la variable est restée dans le terminal lors du test.
je corrige.

Dernière modification par Watael (Le 12/09/2017, à 18:12)


eval, c'est mal.

Hors ligne

#19 Le 13/09/2017, à 13:09

credenhill

Re : [résolu] Bash rechercher/remplacer dans un document texte

sed sans bc

$ sed -r '/EQUIP/{s/\\/\0134\/g; s/"/\\"/g}; s+(.*)(EQUIP013).B([0-9]*)(.*)+echo "\1\2.W$((\3/16-4)).$((\3%16))\4" +e' taglist
<ackaudiofile/>
<acktextfile/>
<setactionlist>
<action type="0" actionid="1" flags="00000000" param=""/>
</setactionlist>
<resetactionlist/>
<ackactionlist/>
</TAG>
<TAG id="1014" name="\\SRV\APPLICOM.OPCServer.1\EQUIP013.W1020.1">
<local>0</local>
<lastchange>2015-11-09T09:04:02</lastchange>
<name/>

Dernière modification par credenhill (Le 13/09/2017, à 14:28)

Hors ligne

#20 Le 16/09/2017, à 01:14

snake57

Re : [résolu] Bash rechercher/remplacer dans un document texte

Merci à tous pour vos réponses,

Le script de Watael et la ligne de commande de credenhill fonctionne bien. Je n'ai pas essayer le script Python de pingouinux ayant déjà deux autres solutions mais je ne doute pas de son fonctionnement wink

Je passe en résolu smile


Toshiba Satellite L775-11N

Hors ligne