J'ai le modèle suivant dans une chaîne (une adresse IP):
123.444.888.235
Je veux remplacer le dernier numéro après le point par 0
, il devient donc:
123.444.888.0
Comment pourrais-je le faire dans bash
un autre langage de script shell?
J'ai le modèle suivant dans une chaîne (une adresse IP):
123.444.888.235
Je veux remplacer le dernier numéro après le point par 0
, il devient donc:
123.444.888.0
Comment pourrais-je le faire dans bash
un autre langage de script shell?
Réponses:
Dans n'importe quel shell POSIX:
${var%pattern}
est un opérateur introduit parksh
dans les années 80, normalisé par POSIX pour lesh
langage standard et maintenant implémenté par tous les shells qui interprètent ce langage, notammentbash
.${var%pattern}
se développe au contenu de$var
dépouillé de la chaîne la plus courte qui correspond au modèle à la fin de celui-ci (ou au même que$var
si ce modèle ne correspond pas). Donc${var%.*}
(où.*
est un motif qui signifie un point suivi d'un nombre quelconque de caractères) se développe$var
sans le plus à droite.
et ce qui le suit. En revanche,${var%%.*}
là où la chaîne la plus longue qui correspond au modèle est supprimée, elle se développerait$var
sans le plus à gauche.
et ce qui suit.la source
${var%.*}
man bash
et appuyez sur entrée, puis tapez/suffix pattern
et appuyez sur entrée. :)new_var="${var%.*}.0"
... nJoy !.Cela devrait fonctionner.
Notez que le dernier champ de
sed
substitution,,\10
est le premier motif apparié (\1
), concaténé avec un zéro littéral.la source
Quelques façons (elles supposent toutes que vous souhaitez modifier le dernier ensemble de nombres de la chaîne):
Ici,
-F'.'
indiqueawk
d'utiliser.
comme séparateur de champ d'entrée et-vOFS='.'
de l'utiliser comme séparateur de champ de sortie. Ensuite, nous mettons simplement le dernier champ ($NF
) à 0 et imprimons la ligne (1;
est unawk
raccourci pour "imprimer la ligne actuelle").Le
-p
ditperl
d'imprimer chaque ligne d'entrée après avoir appliqué le script donné par-e
. Le script lui-même n'est qu'un simple opérateur de substitution qui remplacera un ou plusieurs nombres à la fin de la ligne par0
.La même idée dans
sed
, en utilisant[0-9]
au lieu de\d
.Si votre chaîne est dans une variable et que vous utilisez un shell qui prend en charge ici les chaînes (telles que
bash
ouzsh
par exemple), vous pouvez changer ce qui précède en:la source
Cas général d'application d'un masque de réseau à une adresse IP:
Étant donné que votre entrée est une adresse IP et que vous remplacez le dernier octet de cette adresse
.0
, je suppose que ce que vous essayez vraiment de réaliser est de calculer la partie réseau de l'adresse IP à l'aide du255.255.255.0
masque de réseau.Remplacer simplement des octets par des zéros est OK si la longueur de votre masque de réseau est divisible par 8, mais ce n'est pas le cas général. Si vous devez effectuer cette opération pour n'importe quel masque de sous-réseau valide (sous-réseau), vous pouvez faire quelque chose comme ceci:
Cela définit 3 fonctions:
d2i()
convertit la forme décimale en pointillés d'une adresse IP (ou d'un masque) en un entier simplei2d()
fait le contraire - convertit un entier simple en une décimale en pointillésipmask()
calcule simplement un ET au niveau du bit d'une adresse et d'un masque de réseau pour donner la partie réseau d'une adresse. Bash s'attend à ce que les opérandes de&
soient des entiers.Les deux appels
ipmask
montrent comment le réseau peut être calculé à partir d'une adresse IP pour deux masques différents.Remarque, comme indiqué dans la question,
123.444.888.235
est une adresse IP non valide. J'ai utilisé à la123.44.88.235
place pour ces exemples.la source
Une
sed
réponse alternative :Il regroupe tout jusqu'au dernier point et remplace la ligne complète par le contenu du groupe suivi de 0.
J'utilise -r pour éviter d'avoir à échapper les parenthèses.
la source