Ich habe das folgende Muster in einer Zeichenfolge (eine IP-Adresse):
123.444.888.235
Ich möchte die letzte Zahl nach dem Punkt durch ersetzen 0
, damit es wird:
123.444.888.0
Wie könnte ich es in bash
oder einer anderen Shell-Skriptsprache tun ?
bash
shell-script
string
Ari
quelle
quelle
Antworten:
In jeder POSIX-Shell:
${var%pattern}
ist ein Operator, derksh
in den 80er Jahren von POSIX für die Standardsprache standardisiertsh
und jetzt von allen Shells implementiert wurde, die diese Sprache interpretieren, einschließlichbash
.${var%pattern}
Erweitert sich auf den Inhalt der$var
gestrippten Zeichenfolge der kürzesten Zeichenfolge, die mit dem Muster am Ende übereinstimmt (oder auf den gleichen$var
Wert, als ob dieses Muster nicht übereinstimmt). Also${var%.*}
(wo.*
ist ein Muster , das Punkt bedeutet, gefolgt von einer beliebigen Anzahl von Zeichen) wird$var
ohne das am weitesten rechts stehende.
und was darauf folgt erweitert. Im Gegensatz dazu wird${var%%.*}
die längste Zeichenfolge, die mit dem Muster übereinstimmt,$var
ohne die am weitesten links stehende Zeichenfolge und die darauf folgenden Zeichenfolgen erweitert.
.quelle
${var%.*}
man bash
dann ein/suffix pattern
und drücken Sie die Eingabetaste. :)new_var="${var%.*}.0"
... nJoy!.Das sollte funktionieren.
Beachten Sie, dass das letzte
sed
Substitutionsfeld\10
das erste übereinstimmende Muster (\1
) ist, das mit einer wörtlichen Null verkettet ist.quelle
Einige Möglichkeiten (alle setzen voraus, dass Sie den letzten Satz von Zahlen in der Zeichenfolge ändern möchten):
Hier wird angegeben,
-F'.'
dassawk
es.
als Eingabefeldtrennzeichen und-vOFS='.'
als Ausgabefeldtrennzeichen verwendet werden soll. Dann setzen wir einfach das letzte Feld ($NF
) auf 0 und drucken Sie die Linie (1;
ist eineawk
Abkürzung für „die aktuelle Zeile drucken“).Das
-p
sagtperl
, dass jede Eingabezeile gedruckt werden soll, nachdem das von gegebene Skript angewendet wurde-e
. Das Skript selbst ist nur ein einfacher Substitutionsoperator, der eine oder mehrere Zahlen am Ende der Zeile durch ersetzt0
.Die gleiche Idee in
sed
, mit[0-9]
anstelle von\d
.Wenn sich Ihre Zeichenfolge in einer Variablen befindet und Sie eine Shell verwenden, die hier Zeichenfolgen unterstützt (wie z. B.
bash
oderzsh
), können Sie Folgendes ändern:quelle
Allgemeiner Fall für das Anwenden einer Netzmaske auf eine IP-Adresse:
Angesichts der Tatsache, dass Ihre Eingabe eine IP-Adresse ist und Sie das letzte Oktett dieser Adresse durch ersetzen
.0
, gehe ich davon aus, dass Sie wirklich versuchen, den Netzwerkanteil der IP-Adresse mithilfe der255.255.255.0
Netzmaske zu berechnen .Das einfache Ersetzen von Oktetten durch Nullen ist in Ordnung, wenn Ihre Netzmaskenlänge durch 8 teilbar ist, dies ist jedoch nicht der allgemeine Fall. Wenn Sie diesen Vorgang jemals für eine gültige (Subnetz-) Netzmaske ausführen müssen, können Sie Folgendes tun:
Dies definiert 3 Funktionen:
d2i()
konvertiert die Punkt-Dezimal-Form einer IP-Adresse (oder Maske) in eine einfache Ganzzahli2d()
macht das Gegenteil - konvertiert eine einfache Ganzzahl in eine gepunktete Dezimalstelleipmask()
Berechnet einfach ein bitweises UND einer Adresse und einer Netzmaske, um den Netzwerkteil einer Adresse anzugeben. Bash erwartet, dass die Operanden von&
ganze Zahlen sind.Die beiden Aufrufe
ipmask
zeigen, wie das Netzwerk aus einer IP-Adresse für zwei verschiedene Masken berechnet werden kann.Beachten Sie, wie in der Frage angegeben,
123.444.888.235
eine ungültige IP-Adresse. Ich habe123.44.88.235
stattdessen für diese Beispiele verwendet.quelle
Eine alternative
sed
Antwort:Es gruppiert alles bis zum letzten Punkt und ersetzt die vollständige Zeile durch den Inhalt der Gruppe, gefolgt von 0.
Ich verwende -r, um zu vermeiden, dass Klammern ausgeblendet werden müssen.
quelle