extrai url entre 2 strings em um arquivo

3

Eu tenho um arquivo no qual cada linha é assim

"372"^""^"2015-09-03 06:59:44.475"^"NEW"^"N/A"^""^0^"105592"^"https://example-url.com"^"example-domain < MEN'S ULTRA < UltraSeriesViewAll (18)"^"New"^"MERCHANT_PROVIDED"

Eu quero extrair os URLs no arquivo - https://example-url.com

Eu tentei esses regex usando o comando sed - sed -n '/"^"http/,/"^"/p'

Mas isso não resolveu o meu problema.

    
por Anurag Sharma 04.09.2015 / 14:10

4 respostas

4

Você poderia usar isso

sed -n 's!^.*\^"\(http[^^]*\)"^.*!!p'

A pegadinha em potencial de um novato para REs é que ^ é um indicador para início da linha , então você tem que garantir que você escape \^ se você quiser uma seta para cima literal o início do seu RE.

A correspondência do padrão RE pode ser explicada da seguinte forma

  • ^.*\^" - Combine desde o início da linha até vermos a última possível citação dupla ^" que satisfaz o resto do padrão
  • \( - Inicia um bloco de substituição que pode ser substituído como
  • http[^^]* - corresponde a http seguido por tantos caracteres que não são ^ quanto possível
  • \) - Encerra o bloco de substituição "^.* - Faça a correspondência entre aspas duplas e a seta para cima "^ , o máximo possível (até o final da linha)

Essa correspondência inteira é substituída por , que é o bloco de padrões começando http

    
por 04.09.2015 / 15:19
3

Tente isto:

echo "372"^""^"2015-09-03 06:59:44.475"^"NEW"^"N/A"^""^0^"105592"^"https://example-url.com"^"example-domain < MEN'S ULTRA < UltraSeriesViewAll (18)"^"New"^"MERCHANT_PROVIDED" | cut -f9 -d^
    
por 04.09.2015 / 14:13
3

Se a sua versão do grep suporta o modo PCRE, você pode tentar

grep -Po '(?<="\^")http.+?(?="\^")'
    
por 04.09.2015 / 14:34
0

Se os URLs começarem sempre com http e terminarem com uma cotação, basta pesquisar a string http e tudo até a próxima cotação:

  1. grep

    $ grep -o 'https*://[^"]*' file
    https://example-url.com
    
  2. sed

    $ sed -n 's#.*\(https*://[^"]*\).*##;p' file
    https://example-url.com
    
  3. Perl

    $ perl -ne 's#.*(https*://[^"]*).*## && print' file
    https://example-url.com
    
  4. Com uma abordagem ligeiramente diferente, você também pode usar awk . Basta usar -F para definir o delimitador de campo como " e imprimir qualquer campo que comece com hhtp :

    $ awk -F\" '{for(i=1;i<NF;i++){if($i~/^http/){print $i}}}' file
    https://example-url.com
    
por 05.09.2015 / 18:47