Modification d'un fichier texte en bash

Fermé
Marui - 5 mai 2008 à 13:38
 Marui - 6 mai 2008 à 09:26
Bonjour,
Je souhaiterais modifier un champ précis dans un fichier de configuration d'un switch.
Le fichier se présente sous cette forme et les parties qui m'intéresse sont celles ci:
...
VLAN (
NAME=DEFAULT_VLAN
PORT_MAP=ffffff000000
MODE=222222
)

VLAN (
NAME=test
PORT_MAP=ffffff000000
MODE=------
)
...

J'aimerais assigner tel ou tel port dans le vlan test, ou dans le default, suivant des critères que j'ai fais dans un autre script. Le problème c'est que ces critères vont changer, et ces ports devront être assignés dynamiquement.
Seul la ligne "MODE" m'intéresse, mais je ne vois pas comment modifier juste un caractère de cette ligne précise ( un "-" indique que le port n'est pas associé à ce vlan, et un "2" qu'il lui est associé).

Un exemple de fonctionnement:
Je me base sur l'adresse MAC de l'ordinateur qui souhaite se connecter (je sais la sécurité est nulle dans ce cas précis).
l'ordinateur A se branche sur le port 1
son adresse MAC est connue?
si oui :le port 1 est associé au vlan default
si non : le port 1 est associé au vlan test

Merci d'avance.
A voir également:

7 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
5 mai 2008 à 14:25
Salut,

Si j'ai bien compris, tu veux inverser les champs "MODE" en fonction du résultat de ta requête sur l'adresse MAC ?

En partant de ton exemple, voilà une solution pour le faire (rajouter l'option '-i.bak' pour une modification effective du fichier original et la création d'une copie de sauvegarde avec extension ".bak") :
[tmpfs]$ cat vlan
...
VLAN (
NAME=DEFAULT_VLAN
PORT_MAP=ffffff000000
MODE=222222
)

VLAN (
NAME=test
PORT_MAP=ffffff000000
MODE=------
)
...
[tmpfs]$ sed '/DEFAULT_VLAN/{n;n;s/\(MODE=\).*/\1------/};/test/{n;n;s/\(MODE=\).*/\1222222/}' vlan
...
VLAN (
NAME=DEFAULT_VLAN
PORT_MAP=ffffff000000
MODE=------
)

VLAN (
NAME=test
PORT_MAP=ffffff000000
MODE=222222
)
...
[tmpfs]$
;-))
0
C'est exactement ça !!
Il me suffit juste de modifier tel ou tel "port" pour coller à ce dont j'ai besoin.
Merci beaucoup!!!!
0
J'ai une question rapport à ta commande. Si je ne souhaite modifier que le 5 caractère par exemple ( le deuxième '2' de vlan default en '-'), il me suffit d'utiliser les expressions régulières?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
5 mai 2008 à 15:05
[tmpfs]$ sed '/DEFAULT_VLAN/{n;n;s/2/-/2};/test/{n;n;s/-/2/5}' vlan
...
VLAN (
NAME=DEFAULT_VLAN
PORT_MAP=ffffff000000
MODE=2-2222
)

VLAN (
NAME=test
PORT_MAP=ffffff000000
MODE=----2-
)
...
[tmpfs]$;-))
0

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

Posez votre question
Merci , j'allais poster la réponse tellement elle était évidente...
Merci beaucoup en tous cas! :)
0
C'est bizarre, cette commande devrai marcher non?

sed '/DEFAULT_VLAN/{n;n;s/\(MODE=\)./\1-/5};/test/{n;n;s/\(MODE=\)./\12/5}' vlan
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 mai 2008 à 09:22
Ben non.
Si tu veux juste changer le 5ème caractère se trouvant après le signe égale, il te faut employer la syntaxe donnée dans mon précédent message...
0
D'accord.
C'est qu'hier j'avais fait ce test :

sed '/DEFAULT_VLAN/{n;n;s/\(MODE=\)./\1-/1};/test/{n;n;s/\(MODE=\)./\12/1}' vlan
Et donc ça changeai bien le premier caractère.
J'en avais déduis que ça pouvait fonctionner en changeant le '1' par le Nième caractère.
Bref,
Merci en tous cas :)
0