Resumindo e esclarecendo a pergunta e os objetivos:
- Objetivo: obter uma lista de endereços IP que começam com
192
e terminam com 2
ou 002
- Consiste em:
192.168.001.002
, 192.168.001.2
, 192.168.1.002
ou
%código%
- Tentei:
192.168.1.2
- Atualizado:
(\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3})
- funciona, mas seleciona uma string desnecessária (\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})
Provavelmente o que você quer é:
-
192.168.027.021
- Selecionar string
grep -P "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
- (Get-Content ip.txt)
"\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
Se você realmente quer apenas '192' como o primeiro octeto, então faça isso literalmente:
-match "\b\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b"
Se você quiser apenas padrões de IP que terminem com apenas 0 ou 2 no último octeto, eles também funcionarão (os 3 padrões são os mesmos):
-
Select-String "\b192\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt
- Selecionar string
grep -P "\b(\d{1,3}\.){3}[02]{1,3}\b" ip.txt
- (Get-Content ip.txt)
"\b(\d{1,3}\.){3}[02]{1,3}\b" ip.txt
Um a três dígitos, em seguida, um -match "\b(\d{1,3}\.){3}[02]{1,3}\b"
, três vezes, depois, 1-3 .
ou 0
caracteres, com uma quebra de 'palavra' antes & depois.
Depende da ferramenta Regex que você está usando, mas testarei com 2
(compatível com PCRE / perl) ou com o PowerShell / .net, que é bastante semelhante.
Seu primeiro Regex: grep -P
diz:
- Encontre 3 dígitos e um literal
(\d{3}\.)(\d{3}\.)(\d{1,3}\.)(\d{1,3})
(ponto)
- Seguido por: 3 dígitos e um literal
.
(ponto)
- Seguido de: 1 a 3 dígitos e um literal
.
(ponto)
- Seguido por: 1 a 3 dígitos
Os parênteses são desnecessários, a menos que você queira quantificar grupos ou usá-los em uma substituição ou referência anterior.
Ele não diz nada sobre isso ter que ser "no começo ou no final da string / linha - provavelmente Ok, mas se eles estão embutidos em um texto, pode não ser uma suposição exata.
Sua segunda tentativa .
é semelhante, exceto pela quarta parte (\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})
, que diz:
- Encontre
([02]{1,3})
ou 0
uma a três vezes.
... então sim, ele será igual quando o final for 2
- que é 021
e não há nada a dizer "deve estar no final ou na linha ou o próximo caractere não pode ser um dígito (isso não é ' t a 02
ou 0
).
Você precisa "ancorar" seu regex para isso - fixá-lo ao final da linha, ao texto literal ou a uma "quebra de palavra", etc.
Mais simples e talvez mais geral é a âncora "quebra de palavras": \ b
É uma afirmação de largura zero (não corresponde a nenhum caractere real, mas afirma / exige que algo seja verdadeiro, a transição de 'caracteres de palavra' para caracteres que não são de palavras.)
- Seu:
2
- Corrigido:
grep -P "(\d{3}\.)(\d{3}\.)(\d{1,3}\.)([02]{1,3})\b" ip.txt
- simplificado:
grep -P "\d{3}\.\d{3}\.\d{1,3}\.[02]{1,3}\b" ip.txt