Remover nomes de domínio inválidos com Sed

1

Estou tendo problemas para escrever um comando sed. Faça o seguinte. Eu tenho um arquivo que deve conter apenas nomes de domínio "válidos". Como eu uso com o sed para remover qualquer linha que não corresponda a uma expressão?

O seguinte parece corresponder às linhas que quero manter na ferramenta on-line que usei, embora tenha certeza de que poderia ser escrita melhor.

^*.*[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,15}?$

O arquivo

example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example
example.example.co.uk
(example)
example.photography
example.info
example/
example.
example</h1>
{example}
etc.

Resultado esperado:

example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example.example.co.uk
example.photography
example.info

Obrigado pela ajuda.

    
por Mike 16.07.2015 / 23:43

1 resposta

0

Tive que modificar seu regex para torná-lo válido, mas esse comando sed imprime apenas as linhas correspondentes:

$ sed -nr '/[.].*[a-zA-Z0-9][a-zA-Z0-9-]+([.][a-zA-Z]{2,15})?$/p' file
example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example.example.co.uk
example.photography
example.info

Como funciona

  • -n

    Isso diz ao sed para não imprimir uma linha, a menos que solicitemos explicitamente a ela.

  • -r

    Isso diz ao sed para usar expressões regulares estendidas.

  • /[.].*[a-zA-Z0-9][a-zA-Z0-9-]+([.][a-zA-Z]{2,15})?$/p

    /.../ seleciona as linhas que correspondem à regex e /.../p informa sed para imprimir as linhas que correspondem à expressão regular.

Alterações na regex

Observe que ^* não é uma maneira válida de iniciar uma regex. ^ corresponde ao início de uma linha e * corresponderia a zero ou mais do caractere precedente, mas nenhum caractere precedente é fornecido. Isso pode ser validado com a adição de um período como em ^.* . Isso corresponde a uma linha que começa com qualquer coisa. Mas, como isso não é útil aqui, eu o removi.

Além disso, como parece que você queria excluir linhas que terminam com um período, alterei \.[a-zA-Z]{2,15}?$ para ([.][a-zA-Z]{2,15})?$ .

Para as tentativas de outras pessoas de tornar um regex compatível com nomes de domínio, consulte, por exemplo, Domain validação de nome com RegEx ou regex corresponde ao nome de domínio principal .

    
por 16.07.2015 / 23:52