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 uso com sed para remover alguma linha que não corresponda a uma expressão?
O texto a seguir parece corresponder às linhas que desejo manter na ferramenta on-line que usei, embora tenha certeza de que poderia ser escrito 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.
Responder1
Tive que modificar seu regex para torná-lo válido, mas este 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.
-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 ao regex e/.../p
diz ao sed para imprimir as linhas que correspondem ao regex.
Mudanças na regex
Observe que essa ^*
não é uma maneira válida de iniciar um regex. ^
corresponde ao início de uma linha e *
corresponde a zero ou mais do caractere anterior, mas nenhum caractere anterior é fornecido. Isso poderia ser validado com a adição de um ponto como em ^.*
. Isso corresponde a uma linha que começa com qualquer coisa. Mas, como isso não ajuda aqui, removi-o.
Além disso, como parece que você queria excluir linhas que terminam com ponto final, mudei \.[a-zA-Z]{2,15}?$
para ([.][a-zA-Z]{2,15})?$
.
Para tentativas de outras pessoas de criar uma regex para corresponder a nomes de domínio, consulte, por exemplo,Validação de nome de domínio com RegExouregex corresponde ao nome de domínio principal.