Aqui estão algumas abordagens mais simples para conseguir o que você quer:
-
grep
com PCREswget -q -O - "serverlink" | grep -oP 'flvurl=\K[^;]+(?=&)'
Explicação
Nos PCREs, o
\K
significa "descartar tudo combinado até aqui" . A opção-o
paragrep
significa "imprimir apenas a parte correspondente de uma string" . Portanto,grep -oP 'flvurl=\K
significa: "procureflvurl=
e comece a corresponder após ." A[^;]+
significa "corresponde a muitos não;
caracteres possíveis .O formato
foo(?=bar)
é chamado de lookahead positivo . Não faz parte da cadeia de correspondência real. Isso significa _ "corresponderfoo
seguido porbar
mas descartarbar
. Juntando tudo isso, a expressão regular acima exibirá tudo entreflvurl=
e&
. -
sed
wget -q -O - "serverlink" | sed -nr 's/.*flvurl=([^;]+)&.*//p'
Explicação
O operador de substituição (eu uso o tradicional
s///
em vez dos\\
que você usou, mas é a mesma ideia), substituirá tudo com o texto entreflvurl=
e&
. Os parênteses estão lá para "capturar" a string correspondente, disponibilizando-a como. A opção
-r
ativa expressões regulares estendidas que podem lidar com parênteses sem precisar escapar (\(
e\)
) deles. Essa é a razão pela qual você estava recebendo o erro pelo caminho.O
-n
suprime a saída normal, nenhuma linha será impressa por padrão. Op
no final da substituição (s///p
) significa "imprimir a linha atual se a substituição foi bem sucedida" . -
Perl
Usando a mesma lógica que o
sed
acima:wget -q -O - "serverlink" | perl -ne 's/.*flvurl=([^;]+)&.*// && print'