Como remover tudo depois de http://example.com com awk ou sed

1

Digamos que eu tenha um arquivo de saída com uma grande quantidade de URLs. Como removo uma parte do URL com awk ou sed para que o resultado final seja http://example.com e não http://example.com/folder/file.html .

    
por user256575 20.10.2017 / 21:07

4 respostas

1

Para remover tudo após o primeiro solitário (não o dobro) / :

sed -r 's#([^/])/[^/].*##'

A expressão s#([^/])/[^/].*## executará uma substituição usando a expressão regular ([^/])/[^/].* . Isso corresponderá a qualquer caractere que não seja / , seguido por um único / (e outros caracteres no final da linha de entrada).

A substituição substitui a partida pelo personagem na frente do lone / (que, de outra forma, seria substituído).

Testando no arquivo

http://example.com/folder/file.html
http://example.bar.com/folder/file.html
http://example.com:8080/folder/file.html
$ sed -r 's#([^/])/[^/].*##' file
http://example.com
http://example.bar.com
http://example.com:8080

Usando awk :

$ awk -F'/' '{ print $1 "//" $3 }' file
http://example.com
http://example.bar.com
http://example.com:8080

Aqui, eu estou usando / como um delimitador de campo, e então eu estou simplesmente escolhendo o primeiro e o terceiro campo e exibindo-os com a string // intermediária.

    
por 20.10.2017 / 21:31
1

Você pode usar sed :

 sed 's#^\(https\?://\)\?\([^/]*\)/.*##' filename

Com este comando e o seguinte arquivo,

http://example.com/foo/bar.html
https://example.com/foo/bar.html
example.com/foo/bar.html

a saída será

http://example.com
https://example.com
example.com

A maneira como funciona é a seguinte

  • \(https\?://\)\? corresponde, no máximo, a uma ocorrência de http:// ou https:// . Os parênteses capturam a correspondência em

  • \([^/]*\) corresponde a qualquer coisa depois disso até o próximo / e a correspondência é capturada em

  • /.* corresponde ao restante da linha.

por 20.10.2017 / 21:21
0

PARA usar sed para extrair partes finais de URLs, supondo que sejam uma por linha ou separadas por espaço:

sed 's!\(http://[^/]*\)[^ ]*!!g' < input > output

Isso usa a pesquisa e & substituir funcionalidade; os delimitadores entre o padrão, a substituição e os sinalizadores são definidos como ! aqui.

O padrão a corresponder é:

  • http:// seguido por qualquer coisa, exceto uma barra invertida - e essa seção do padrão é capturada entre parênteses como "grupo 1"
  • (qualquer coisa, exceto um espaço), zero ou mais vezes - essa é a parte final da URL, especificamente não capturada entre parênteses

A substituição é:

  • o "grupo 1" capturado anteriormente

As bandeiras são:

  • faça isso g lobally, ou seja, quantas vezes por linha possível
por 20.10.2017 / 21:23
0

Para arquivos grandes grep pode fazer o trabalho rapidamente. Também é fácil lembrar a sintaxe.

grep -Eo '^https?://[^/]+' fname

Usar sed não exige mais que

sed -r 's|(https?://[^/]*).*||' fname

ou cut sem usar expressões regulares difíceis

cut -d'/' -f1,2,3 fname
    
por 20.10.2017 / 21:55