Tengo el siguiente patrón en una cadena (una dirección IP):
123.444.888.235
Quiero reemplazar el último número después del punto con 0
, por lo que se convierte en:
123.444.888.0
¿Cómo podría hacerlo en bash
otro lenguaje de script de shell?
bash
shell-script
string
Ari
fuente
fuente
Respuestas:
En cualquier shell POSIX:
${var%pattern}
es un operador introducido porksh
los años 80, estandarizado por POSIX para elsh
lenguaje estándar y ahora implementado por todos los shells que interpretan ese idioma, incluidobash
.${var%pattern}
se expande al contenido$var
despojado de la cadena más corta que coincide con el patrón al final (o al mismo como$var
si ese patrón no coincidiera). Entonces${var%.*}
(donde.*
hay un patrón que significa punto seguido de cualquier número de caracteres) se expande hasta el$var
extremo derecho.
y lo que le sigue. Por el contrario,${var%%.*}
donde se despoja la cadena más larga que coincide con el patrón se expandiría$var
sin el extremo izquierdo.
y lo que sigue.fuente
${var%.*}
man bash
y presione enter, luego escriba/suffix pattern
y presione enter. :)new_var="${var%.*}.0"
... nJoy !.Esto debería funcionar.
Tenga en cuenta que el último campo de
sed
sustitución,\10
es el primer patrón coincidente (\1
), concatenado con un cero literal.fuente
Algunas formas (todas suponen que desea cambiar el último conjunto de números en la cadena):
Aquí,
-F'.'
indicaawk
que se use.
como separador de campo de entrada y-vOFS='.'
que se use como separador de campo de salida. Luego, simplemente establecemos el último campo ($NF
) en 0 e imprimimos la línea (1;
es laawk
abreviatura de "imprimir la línea actual").El
-p
le diceperl
que imprima cada línea de entrada después de aplicar el script dado por-e
. El script en sí es solo un simple operador de sustitución que reemplazará uno o más números al final de la línea0
.La misma idea en
sed
, usando en[0-9]
lugar de\d
.Si su cadena está en una variable y utiliza un shell que admite cadenas aquí (como
bash
ozsh
por ejemplo), puede cambiar lo anterior a:fuente
Caso general para aplicar una máscara de red a una dirección IP:
Dado que su entrada es una dirección IP y que está reemplazando el último octeto de esa dirección
.0
, supongo que lo que realmente está tratando de lograr es calcular la porción de red de la dirección IP, usando la255.255.255.0
máscara de red.Simplemente reemplazar octetos con ceros está bien si la longitud de su máscara de red es divisible por 8, pero este no es el caso general. Si alguna vez necesita realizar esta operación para cualquier máscara de red (subred) válida, puede hacer algo como esto:
Esto define 3 funciones:
d2i()
convierte la forma decimal punteada de una dirección IP (o máscara) en un entero simplei2d()
hace lo contrario: convierte un entero simple en un decimal punteadoipmask()
simplemente calcula un AND a nivel de bit de una dirección y una máscara de red para dar la porción de red de una dirección. Bash espera que los operandos de&
sean enteros.Las dos llamadas
ipmask
muestran cómo se puede calcular la red a partir de una dirección IP para dos máscaras diferentes.Tenga en cuenta que como se indica en la pregunta,
123.444.888.235
es una dirección IP no válida. En su lugar, he usado123.44.88.235
para estos ejemplos.fuente
Una
sed
respuesta alternativa :Agrupa todo hasta el último punto y reemplaza la línea completa con el contenido del grupo seguido de 0.
Uso -r para evitar tener que escapar del paréntesis.
fuente