Como posso excluir uma string usando uma expressão regular?

5

Eu tenho este arquivo chamado test:

http://edge.sharethis.com
http://edge.sharethis.com
https://timetosa.com
http://timetosa.com
https://webtest.es
holahttp.com
timetosa

Eu quero uma expressão que exclua qualquer linha que contenha um horário.

Isso não é permitido: cat test | grep -v timetosa , porque eu quero usar uma expressão regular pura em outro programa.

Eu sei que tem a ver com ^ , mas não consigo chegar à solução correta, para afetar os que não incluem o horário da string:

cat test | sed 's/^[timetosa]//g' e cat test | sed 's/^(timetosa)//g' sem sucesso.

Alguém poderia me ajudar ¿?

    
por aDoN 10.02.2015 / 10:53

2 respostas

2

sed '/timetosa/d' <test

... vai fazer isso. Alternativamente:

sed -n '/timetosa/!p' <test

Ainda assim, embora (seja permitido ou não) :

grep -v timetosa <test

... será a solução de maior desempenho dos três - e provavelmente por uma margem significativa.

Graças a @Sparhawk, encontrei meu caminho para a documentação do zaproxy . Com base nisso:

  • regexs de URL
    • Nos painéis Incluir em *, Excluir * e Indicadores da Autenticação painel, você pode inserir expressões regulares para definir URLs excluídos.

... e o seguinte, eu acho que você está tentando filtrar Contextos ? De acordo com os documentos, você pode incluir as listas de exclusão e :

  • Excluir do contexto
    • Isso permite gerenciar os URLs que serão excluídos do contexto.
    • Você só precisa especificar regexs para URLs que não deseja incluir, mas que correspondem a uma ou mais das expressões regulares include .

Então você pode excluir algumas das suas inclusões anteriores.

Ainda assim, pode ser que o primeiro bit disso não seja inteiramente irrelevante - os documentos também mencionam isso na seção Complementos :

  • Invocar aplicativos

    • Outros aplicativos podem ser chamados transmitindo informações de contexto, como o URL da mensagem selecionada.
    • Assim, por exemplo, nmap poderia ser chamado passando o site que você deseja varrer.

    • As aplicações são configuradas com o ecrã Opções .

por 10.02.2015 / 11:08
0

Os idiomas regulares são fechados em complementação, portanto, para cada expressão regular, existe uma expressão regular que corresponde exatamente às entradas que o regexp original não corresponde.

No entanto, no pior dos casos, o menor regexp que corresponde à linguagem do complemento tem um comprimento exponencial no comprimento do regexp original. Então, enquanto o regexp é garantido, não é garantido que seja simples. Pode ser calculado algoritmicamente se você realmente precisar dele.

O operador ^ para ancorar um regexp não é relevante. Você pode estar pensando em ^ em um conjunto de caracteres, como em [^a-z] , que significa “qualquer caractere que não seja uma letra minúscula”. Isso é apenas parte da notação de atalho para conjuntos de caracteres, não é útil para complementar um conjunto de seqüências de caracteres.

Alguns mecanismos de expressão regular, como o PCRE amplamente usado, suportam operadores adicionais além dos tradicionais, incluindo declarações de visão geral . Uma afirmação de lookahead negativa fornece uma maneira simples de negar uma expressão regular sem ter que dividi-la em partes. Verifique a documentação do seu software para ver que tipo de expressões regulares ele suporta.

^!(.*timetosa).*$

A maioria dos sistemas não precisa de complementação regexp porque você pode obter o mesmo efeito usando um sinalizador de inversão correspondente (por exemplo, grep -v ) ou ordenando regras cuidadosamente em uma configuração de primeira correspondência (se corresponder a .*timetosa.* nada e parar de combinar as regras; se corresponder a .* , faça alguma coisa).

    
por 11.02.2015 / 00:47