Eu noto que aspas duplas são usadas ao redor do lote, então eu acho que é feito em cmd.exe (embora muitos usuários linux usem o grep, há a versão do windows. Eu agradeço qualquer correção para mim sobre isso, mas seu exemplo parece-me como se fosse para a implementação do windows, em virtude do uso de aspas duplas, eu também estou usando uma implementação windows do grep - a do gnuwin32 (ao contrário do cygwin, por exemplo).
Antes de tudo, gostaria de corrigir o erro na linha que você usou com o grep (não chamarei isso de erro na sua regex, já que isso é um problema cmd.
Aqui estava o seu exemplo com o seu regex com grep que não estava funcionando.
curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?
Como você diz, [^\"]
não está funcionando
Vamos ver exatamente o que está sendo passado para o grep pelo cmd (o que o grep está analisando)
Isso exigirá um programa em C, o programa em C está incluído nesta pergunta sobre uma citação que não está funcionando Obtendo esta expressão regular simples para combinar com o grep
Vou colar o código do programa em C aqui.
Você pode usar este programa para ver o que o grep ou qualquer programa do Windows recebe. (Eu posso estar errado em alguma tecnicalidade aqui e saúdo uma correção se for assim). Dito isso, isso funciona.
Aqui está o programa que usaremos para determinar o que está acontecendo
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 0;
while (argv[i]) {
printf("argv[%d] = %s\n", i, argv[i]);
i++;
}
return 0;
}
Eu compilei isso. w.c, para w.exe
Aqui está um exemplo simples do que está acontecendo ..
Aqui está um exemplo que funciona
W:\>w "[^\"]"
argv[0] = w
argv[1] = [^"]
W:\>
Você vê acima que nosso programa (w) recebe 2 parâmetros, o primeiro é o nome do programa (w), o segundo é [^"]
Agora aqui está um exemplo bem menor que tem a mesma falha do seu, o [^\"]
não está funcionando
W:\>w "\"[^\"]"
argv[0] = w
argv[1] = "["]
W:\>
Veja o que o grep está recebendo. Eu não sei por que .. Mas parece que quando isso "está antes do [^ \"] e há aspas duplas em torno da coisa toda, então o [^ \ "] não funciona, vemos exatamente o resultado , o [^ \ "] sai como ["] Estamos perdendo o nosso caret ^
Isso preservará o nosso cursor, como podemos ver no programa.
W:\>w "\"[^^\"]"
argv[0] = w
argv[1] = "[^"]
W:\>
Além do problema do Windows, há um problema com o seu regex que você provavelmente deseja ter uma visão antecipada de uma cotação, para que você não corresponda à cotação final. Você justamente incluiu o lookbehind para não coincidir com a cotação inicial.
Como exemplo
W:\>echo blah alt="test" | grep -o -P "(?<=alt=\")[^^\"]*(?=\")"
test
Suponha que tenhamos esse arquivo chamado a.a
dsfsdf dfdsf alt="here" dddd
rrtrtdfddalt="there"dfdfd
alt="df"
tree="dop"
Agora aplicamos
W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df
W:\>
Então, o regex funciona e no grep.
W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df
W:\>
Agora vamos supor que eu poderia produzir isso para um arquivo. a.b então a.b agora contém essas 3 linhas. (você sempre pode copiar / colar em a.b)
Agora a.b tem
here
there
df
vamos usar sed para adicionar um pouco antes e depois
W:\>sed -r "s#(.*)#http://blah.com/.htm#" a.b
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>
E poderíamos baixar todos aqueles com wget
W:\>sed -r "s#(.*)#http://blah.com/.htm#" a.b >a.c
W:\>type a.c
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>wget -i a.c
--2012-07-26 23:21:06-- http://blah.com/here.htm
Resolving blah.com... ^C
W:\>