[sed] Remplacement d'une chaine de caractaire
Résolu
jonigood
Messages postés
476
Date d'inscription
Statut
Membre
Dernière intervention
-
jonigood Messages postés 476 Date d'inscription Statut Membre Dernière intervention -
jonigood Messages postés 476 Date d'inscription Statut Membre Dernière intervention -
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 :
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 :
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.
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:
- [sed] Remplacement d'une chaine de caractaire
- Remplacement coco - Accueil - Réseaux sociaux
- Coco.fr remplacement - Accueil - Réseaux sociaux
- Chaine tnt gratuite sur mobile - Guide
- Plus de chaine tv - Guide
- Chaine radio - Télécharger - Médias et Actualité
5 réponses
Salut,
Et avec un "sleep", ça pourrait le faire aussi...
;-))
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. $
;-))
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
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
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
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
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
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 :-(
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 :-(
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 :
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
:-)
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
:-)
$ 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. ... $
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
Il ne faut pas exagérer quand même.
Cette fois-ci ne l'oublie pas https://docstore.mik.ua/orelly/perl4/mre/
Cette fois-ci ne l'oublie pas https://docstore.mik.ua/orelly/perl4/mre/
Ta solution ne fonctionne pas
Le compteur ce met bien en route, par contre aucun changement dans le fich.txt ...
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 ;-))
sa fonctionne, je suis gâté aujourd'hui :-)
merci
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.
Oui, mais comme j'étais en train de sleep quand j'ai écrit je ne me suis même pas rendu compte ;-)))