Eu tenho o seguinte padrão em uma string (um endereço IP):
123.444.888.235
Quero substituir o último número após o ponto por 0
, para que ele se torne:
123.444.888.0
Como eu poderia fazer isso em bash
outra linguagem de script de shell?
bash
shell-script
string
Ari
fonte
fonte
Respostas:
Em qualquer shell POSIX:
${var%pattern}
é um operador introduzidoksh
nos anos 80, padronizado pelo POSIX para osh
idioma padrão e agora implementado por todos os shells que interpretam esse idioma, inclusivebash
.${var%pattern}
expande para o conteúdo de$var
stripped da string mais curta que corresponde ao padrão no final dela (ou para o mesmo que$var
se esse padrão não corresponder). Então${var%.*}
(onde.*
está um padrão que significa ponto seguido por qualquer número de caracteres) se expande$var
sem o mais à direita.
e o que se segue. Por outro lado,${var%%.*}
onde a string mais longa que corresponde ao padrão é removida, ela se expandirá para$var
sem a mais à esquerda.
e o que segue.fonte
${var%.*}
man bash
enter e, em seguida, digite/suffix pattern
e pressione enter. :)new_var="${var%.*}.0"
... nJoy !.Isso deve funcionar.
Observe que o último campo de
sed
substituição,,\10
é o primeiro padrão correspondente (\1
), concatenado com um zero literal.fonte
Algumas maneiras (todas elas assumem que você deseja alterar o último conjunto de números na cadeia de caracteres):
Aqui,
-F'.'
dizawk
para usar.
como separador de campos de entrada e-vOFS='.'
para usá-lo como separador de campos de saída. Em seguida, basta definir o último campo ($NF
) para 0 e imprimir a linha (1;
é umaawk
abreviação de "print the current line").O
-p
dizperl
para imprimir cada linha de entrada depois de aplicar o script fornecido por-e
. O script em si é apenas um operador de substituição simples que substituirá um ou mais números no final da linha por0
.A mesma idéia em
sed
, usando em[0-9]
vez de\d
.Se sua string estiver em uma variável e você usar um shell que suporte aqui strings (como
bash
ouzsh
por exemplo), você poderá alterar o acima para:fonte
Caso geral para aplicar uma máscara de rede a um endereço IP:
Dado que sua entrada é um endereço IP e que você está substituindo o último octeto desse endereço
.0
, suponho que o que você realmente está tentando obter é calcular a parte da rede do endereço IP, usando a255.255.255.0
máscara de rede.Simplesmente substituir octetos por zeros é bom se o comprimento da sua máscara de rede é divisível por 8, mas esse não é o caso geral. Se você precisar executar esta operação para qualquer máscara de rede (sub-rede) válida, poderá fazer algo assim:
Isso define três funções:
d2i()
converte a forma decimal pontilhada de um endereço IP (ou máscara) em um número inteiro simplesi2d()
faz o oposto - converte um número inteiro simples em um decimal pontilhadoipmask()
simplesmente calcula um E bit a bit de um endereço e uma máscara de rede para fornecer a parte de rede de um endereço. O Bash espera que os operandos&
sejam inteiros.As duas chamadas
ipmask
mostram como a rede pode ser calculada a partir de um endereço IP para duas máscaras diferentes.Observe como indicado na pergunta,
123.444.888.235
é um endereço IP inválido. Eu usei123.44.88.235
esses exemplos.fonte
Uma
sed
resposta alternativa :Ele agrupa tudo até o último ponto e substitui a linha completa pelo conteúdo do grupo seguido por 0.
Eu uso -r para evitar ter que escapar parênteses.
fonte