Use sed para excluir todos, exceto um determinado padrão

5

Como obtenho apenas a parte do link no http-source de um link?

Eu tenho

<a href="http://unix.stackexchange.com/users/20661/">Unix &amp; Linux

e gostaria de receber apenas

http://unix.stackexchange.com/users/20661/

Eu tentei

sed 's/^.*(http.*)".*$//g'

mas isso dá um erro:

sed: -e expression #1, char 22: invalid reference  on 's' command's RHS
    
por rubo77 07.11.2014 / 08:30

3 respostas

8

Tente isto:

sed -r 's/.*(http[^"]*)".*//g'

No Mac OSX, tente:

sed -E 's/.*(http[^"]*)".*//g'

Notas

Existem vários itens a serem observados sobre esse comando sed :

sed 's/^.*(http.*)".*$//g'
  1. O ^ é desnecessário. As expressões regulares do sed são sempre gananciosas . Isso significa que, se uma regex que comece com .* coincide, ela sempre será igual ao início da linha.

  2. Para tornar ( em um caractere de agrupamento, ele pode ter escape ou a regex estendida pode ser ativada com o sinalizador -r ( -E on OSX). Essa sinalização geralmente reduz bastante o número de escutas que você precisará.

  3. Além disso, como a regex é gulosa, (http.*)" corresponderá à última aspa dupla na linha, não à primeira. O URL terminará, no entanto, com a primeira aspa dupla. Em vez disso, use (http[^"]*)" e a correspondência nunca se estenderá além do primeiro " .

  4. O cifrão em .*$ também é supérfluo. Novamente, como a regex é gulosa, se uma expressão regular terminar com .* corresponde, ela corresponderá ao final da linha.

por 07.11.2014 / 08:46
2

Apenas falta de escape:

sed 's/^.*\(http.*\)".*$//g'

(eu nunca consigo lembrar quais esperam () e quais esperam \(\) ).

    
por 07.11.2014 / 08:32
1

Usando awk :

echo '<a href="http://unix.stackexchange.com/users/20661/">Unix & Linux' \
| awk -F\" '{print $2}'
http://unix.stackexchange.com/users/20661/
    
por 07.11.2014 / 08:32