textmode
(usa Slackware)
Enviado em 19/04/2016 - 19:32h
bkammers escreveu:
Utilizei o método para buscar num único arquivo e separar por variáveis, mas não deu certo.
As expressões utilizadas para $line, não são regexp né?
Procurei a sintaxe específica, mas não achei muita coisa pra me ajudar.
Está quase funcionando, só falta ajustar a parte onde separa as variáveis:
while read line
do
nome=${line% -*}
link=${line#*- }
wget -O "$nome" "$link"
done < arquivoC
{line% -*} e {line#*- }
Estas sintaxes queria entender melhor, acho que o ajuste nelas resolvem meu problema.
Tem algum material sobre estes recursos?
Só agora é que fui ver novamente o seu exemplo para arquivoC e o interpretei errado, lá você tem nas linhas ímpares o link e o nas linhas pares o nome do arquivo correto?
Mas antes, respondendo sua dúvida a respeito do
nome=${line% -*}
e
link=${line#*- }
, essas variáveis estão recebendo o resultado da expansão de parâmetros da variável linha, eu assumi que cada linha seria
nome do arquivo - link para download
e que o separador da informação seria esse ' - ' (espaço, hífen, espaço), deste modo o
% -*
retornaria a porção anterior ao separador e
#*-
retornaria a porção final. Você vai achar no manual do bash, ksh, zsh etc como "Parameter Expansion" e tem vários exemplos interessantes inclusive na web, no info, você pode ir direto no
info bash 'Basic Shell Features' 'Shell Expansions' 'Shell Parameter Expansion'
ou no
info zsh Expansion 'Parameter Expansion'
. Essas expressões não são expressões regulares, são as regras para expansão de nomes de nomes de arquivo (glob) aplicadas em variáveis. Mas existe sim a possibilidade de utilizar regexps nesse caso aí também, minha recomendação é utilizar expressão regular apenas quando realmente necessário.
Voltando para o arquivoC, podemos manter o looping com while, lemos a linha ímpar e armazenamos na variável link, quando lermos a linha par, executaríamos o wget com ambos os valores. Mas tem forma mas simples, podemos usar o paste para juntar a linha ímpar com a par numa única, ficaria mais ou menos assim:
while IFS=$'\t\n' read link nome; do
echo wget -O "$nome" "$link"
done < <(paste - - < arquivoC)
Se tiver certeza que o comando está certo, aí você remove o 'echo'. Outra coisa, não pode existir caractere de tabulação no arquivoC.