Como posso acrescentar várias extensões a uma string com sed?

1

Eu quero criar um script que me permita baixar imagens de subreddits inteiros de uma só vez, mas atualmente estou apenas obtendo os links certos (um problema por vez! ^^). De qualquer forma, como não consigo pensar em uma maneira de determinar o formato da imagem no link, eu esperava que sed pudesse ser usada para especificar várias extensões durante a substituição (por exemplo, jpg | png | gif)), mas isso não parece funcionar.

grep -E "href=\"/r/bacon/*" bacon.htm | sed "s .*/r/bacon/\(.*\)\".* http://i.imgur.com/.\(\jpg\|\png\|\gif\) "

esperado:

http://i.imgur.com/foo.jpg
http://i.imgur.com/foo.png
http://i.imgur.com/foo.gif

tenho:

http://i.imgur.com/foo.(jpg|png|gif)

O Google também não parece ter uma resposta para este, reconhecidamente, um problema estranho ou pelo menos estou tendo dificuldades em encontrar maneiras significativas de descrevê-lo.

Alguma idéia ou devo tentar isso de um ângulo diferente?

    
por muser 20.02.2014 / 04:06

2 respostas

1

Se eu entendi sua pergunta corretamente, seu grep produzirá um monte de strings como este:

href="http://reddit.com/r/bacon/foo"

E você quer transformar cada um deles em algo como:

http://i.imgur.com/foo.jpg
http://i.imgur.com/foo.png
http://i.imgur.com/foo.gif

Não é particularmente elegante, mas você pode fazer:

sed "s .*/r/bacon/\(.*\)\".* http://i.imgur.com/.jpg\nhttp://i.imgur.com/.png\nhttp://i.imgur.com/.gif "

Exemplo:

timp@helez:~/tmp$ cat bacon.lines 
href="http://reddit.com/r/bacon/foo"
href="http://reddit.com/r/bacon/bar"
timp@helez:~/tmp$ cat bacon.lines | sed "s .*/r/bacon/\(.*\)\".* http://i.imgur.com/.jpg\nhttp://i.imgur.com/.png\nhttp://i.imgur.com/.gif "
http://i.imgur.com/foo.jpg
http://i.imgur.com/foo.png
http://i.imgur.com/foo.gif
http://i.imgur.com/bar.jpg
http://i.imgur.com/bar.png
http://i.imgur.com/bar.gif
    
por 20.02.2014 / 06:31
1

Coloque dentro de um loop,

extension_list="jpg png gif" #easy to add other extensions later, like JPG
: # ... other stuff in the script
for extension in $extension_list
do
    sed "s/foo\(bar\)baz/.$extension/"
    # if you get the file you want, you can use 'break' to exit the loop early
done

Isso está fora do escopo de sua pergunta atual, mas em vez de combinar grep e sed você pode (se quiser) usar apenas sed para imprimir linhas correspondentes, como:

sed -n "s+.*/r/bacon/\(.*\)\".*+http://i.imgur.com/.$extension+p" bacon.htm
    
por 20.02.2014 / 06:52