[sed] Remplacement d'une chaine de caractaire

Résolu/Fermé
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 - 29 mai 2011 à 03:51
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 - 29 mai 2011 à 20:00
salut a tous CCMien et merci de me lire.

Je suis a la recherche d'une commande sed pour modifier une chaine de caractère aléatoire dans un ficher texte précis.... j'explique

J'ai un fichier "FICHIER.txt" qui contient plusieurs centaines de lignes dont une ligne avec une adresse IP sous cette forme :

ADRESSE_IP = 158.365.456.87

J'ai un deuxièmes fichier IP.txt qui contient des adresses IP (9 IP au totale)

le but est de remplacer l'adresse IP du ficher "FICHIER.txt" toute les minutes par une des 9 adresses IP contenu dans le fichier IP.txt, il doit donc y avoir 9 changement d'IP en 9 minute.

Je pense a une tache cron qui exécuterai un script shell toute les minutes en utilisant la commande sed, par exemple la simple commande :

sed 's/ANCIEN-IP/NOUVELLE-IP/g' FICHIER.txt

fera l'affaire pour remplacer une seule fois l'IP du ficher "FICHIER.txt" par une unique autre adresse IP ce qui n'est pas le but.

Comment faire pour avoir une rotation des IP de remplacement en utilisant sed ?

Toute autre solution autre que la commande sed est la bien venu (grep, awk...)

Merci a tous d'avance

jonigood.
A voir également:

5 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
29 mai 2011 à 10:08
Salut,

Et avec un "sleep", ça pourrait le faire aussi...

$ cat fich.txt                  
Mon IP: 192.168.0.1    
         
$ cat ip.txt                    
192.168.0.2                     
192.168.0.3                     
192.168.0.4                     
192.168.0.5                     
192.168.0.6
192.168.0.7
192.168.0.8
192.168.0.9
192.168.0.10

$ cat foo.sh
#! /bin/bash

while read line
do
sed "s/\(.*\) .*/\1 ${line}/" fich.txt
echo "Attente ....."
sleep 3     # A remplacer par 60
done < ip.txt

$ ./foo.sh
Mon IP: 192.168.0.2
Attente .....
Mon IP: 192.168.0.3
Attente .....
Mon IP: 192.168.0.4
Attente .....
Mon IP: 192.168.0.5
Attente .....
etc.
etc.
$

;-))
2
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 10:47
salut zipe31

Ta solution ne fonctionne pas
Le compteur ce met bien en route, par contre aucun changement dans le fich.txt ...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
29 mai 2011 à 10:51
Re-

Normal, la syntaxe dans mon script ne fait qu'afficher le résultat sans modifier le fichier d'origine (fich.txt) par souci se sécurité et de test...

Pour que le changement soit effectif il suffit d'ajouter l'option "-i" (--in-place) à la commande sed ;-))

sed -i "s/\(.*\) .*/\1 ${line}/" fich.txt
0
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 10:58
yes !

sa fonctionne, je suis gâté aujourd'hui :-)

merci
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
29 mai 2011 à 11:01
De rien ;-)

Petite précision : La regex s'applique uniquement au format de la ligne "Mon IP: xxx.xxx.xxx.xxx" du fichier "fich.txt".
Si le format diffère, il faudra adapter la regex en fonction.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
29 mai 2011 à 11:20
Salut,

Oui, mais comme j'étais en train de sleep quand j'ai écrit je ne me suis même pas rendu compte ;-)))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 29/05/2011 à 08:34
Salut,

Une idée c'est de créer un fichier compteur qui incremente à chaque exécution de script
Je n'ai pas testé avec cron.
Pour cron il faudrait mettre les chemin complet des fichiers et commandes

lami20j@debian-acer:~$ cat fichier.txt  
Mon IP: 192.168.0.1 
lami20j@debian-acer:~$ cat IP.txt  
192.168.0.2 
192.168.0.3 
192.168.0.4 
192.168.0.5 
192.168.0.6 
192.168.0.7 
192.168.0.8 
192.168.0.9 
192.168.0.10 
lami20j@debian-acer:~$ cat IP.compteur  
1 
lami20j@debian-acer:~$ cat changeIP.sh  
#!/bin/bash 

n=$(cat IP.compteur) 
IP_OLD=$(egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' fichier.txt) 
IP_NEW=$(egrep -m $n '([0-9]{1,3}\.){3}[0-9]{1,3}' IP.txt |tail -1)  
sed -i 's/'"$IP_OLD"'/'"$IP_NEW"'/' fichier.txt 
echo $((n+1)) > IP.compteur 
if [ $n = "9" ] 
then 
echo 1 > IP.compteur 
fi 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.2 
2 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.3 
3 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.4 
4 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.5 
5 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.6 
6 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.7 
7 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.8 
8 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.9 
9 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.10 
1 
lami20j@debian-acer:~$ sh changeIP.sh  
lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
Mon IP: 192.168.0.2 
2


GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
0
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 11:05
yep ^^
0
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 10:09
salut l'ami

Encore une fois l'ami20j claire net et précis , sa fonctionne du premier coup !

Je trouverai bien une solution un jour ou l'autre pour te dire MERCI !!!!!!!!

thankSSSSS
0
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 17:57
De retour

Vous pouvez m'adapter la regex a une autre chaine de caractère SVP ? J'ai vraiment du mal avec les regex

remplacer :

Mon IP: 192168.0.1
Par
smtp_bind_address = 192.168.0.1

Merci d'avance

PS: lami20j stp peut tu me renvoyer le lien que tu ma filé il y a pas longtemps pour les regex je le trouve plus :-(
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
29 mai 2011 à 18:03
Avec mon script il n'y a rien à changer, ça marchera aussi bien avec
"smtp_bind_address = 192.168.0.1"
qu'avec "Mon IP: 192168.0.1"

;-))
0
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 18:27
Sa fonctionne partiellement ...

Comme je le précise plus haut dans ce fichier main.cf qui est fichier de conf de postfix il y a plusieurs ligne qui ont la même forme, voici un bout de ce fichier :

smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1


Avec ton script (ce qui est logique) sa remplace toutes les lignes par :

smtp_use_tls = 192.168.0.2
smtp_tls_note_starttls_offer = 192.168.0.2
smtpd_tls_auth_only = 192.168.0.2
smtpd_tls_key_file = 192.168.0.2
smtpd_tls_cert_file = 192.168.0.2
smtpd_tls_CAfile = 192.168.0.2
smtpd_tls_loglevel = 192.168.0.2

:-)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
29 mai 2011 à 18:32
D'où l'intérêt d'afficher des exemples CONCRETS ;-((

Par contre je ne vois nullement dans ton bout de fichier de "smtp_bind_address" ;-\

C'est bien cette ligne que tu veux remplacer chaque minute ?
0
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 18:40
oui excuse pour l'imprécision,

il y a bien la ligne smtp_bind_address dans ce fichier je n'est copier que quelques lignes a titre indicatif

merci
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
29 mai 2011 à 18:46
$ cat fich.txt  
smtp_use_tls = yes                 
smtp_tls_note_starttls_offer = yes 
smtpd_tls_auth_only = yes          
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem  
smtpd_tls_loglevel = 1                          
smtp_bind_address = 192.168.0.1                 

$ cat foo.sh               
#! /bin/bash                                  

while read line
do             
sed "/^smtp_bind_address/ s/\(.*\) .*/\1 ${line}/" fich.txt
echo "Attente ....."                                       
sleep 3     # A remplacer par 60                           
done < ip.txt        
                                      
$ ./foo.sh                            
smtp_use_tls = yes                                       
smtp_tls_note_starttls_offer = yes                       
smtpd_tls_auth_only = yes                                
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtp_bind_address = 192.168.0.2
Attente .....
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtp_bind_address = 192.168.0.3
Attente .....
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtp_bind_address = 192.168.0.4
Attente .....
etc.
etc.
...
$
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 19:44
A oué !

J'ai trouver héhéhé
Mesdames et Messieurs voici la plus grande base de donner de regex dispo sur le web !

A consommé SANS modération, Profitez en :

CLIQUEZ ICI

MDR
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
29 mai 2011 à 19:49
Il ne faut pas exagérer quand même.
Cette fois-ci ne l'oublie pas https://docstore.mik.ua/orelly/perl4/mre/
0
jonigood Messages postés 476 Date d'inscription samedi 5 juin 2004 Statut Membre Dernière intervention 6 juillet 2011 28
29 mai 2011 à 20:00
cool

thanks
0