#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
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 /.
− cqfd93 −
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
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.
Connected \o/
Welcome to sHell. · eval is evil.
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
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)
Connected \o/
Welcome to sHell. · eval is evil.
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)
Connected \o/
Welcome to sHell. · eval is evil.
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
Je passe en résolu
Toshiba Satellite L775-11N
Hors ligne