Ainda mais simples, se você quiser apenas o abc :
echo 'http://www.youtube.com/watch?v=abc&g=xyz' | awk -F'[=&]' '{print $2}'
Se você quiser o xyz :
echo 'http://www.youtube.com/watch?v=abc&g=xyz' | awk -F'[=&]' '{print $4}'
EXPLICAÇÃO:
-
awk: é uma linguagem de script que processa automaticamente os arquivos de entrada linha por linha, dividindo cada linha em campos. Portanto, quando você processa um arquivo comawk, para cada linha, o primeiro campo é$1, o segundo$2etc até$N. Por padrão,awkusa espaços em branco como o separador de campo. -
-F'[=&]':-Fé usado para alterar o delimitador de campo de espaços para outra coisa. Nesse caso, estou dando uma classe de caracteres. Colchetes ([ ]) são usados por muitos idiomas para denotar grupos de caracteres. Portanto, especificamente,-F'[=&]'significa queawkdeve usar tanto&quanto=como delimitadores de campo. -
Portanto, considerando a string de entrada da sua pergunta, usando
&e=como delimitadores,awklerá os seguintes campos:http://www.youtube.com/watch?v=abc&g=xyz |----------- $1 -------------| --- - --- | | | | | ̣----- $4 | -------- $3 ----------- $2Então, tudo que você precisa fazer é imprimir o que você quiser
{print $4}.
Você disse que também quer verificar se a string é uma URL válida do youtube, você não pode fazer isso com sed , pois se ela não corresponder à regex que você der, ela simplesmente imprimirá a linha inteira. Você pode usar uma ferramenta como Perl para imprimir apenas se a regex corresponder:
echo 'http://www.youtube.com/watch?v=abc&g=xyz' |
perl -ne 's/http.*www.youtube.com\/watch\?v=(.+?)&.+/$1/ && print'
Por fim, para simplesmente imprimir abc , você pode usar a ferramenta padrão do UNIX cut :
echo 'http://www.youtube.com/watch?v=abc&g=xyz' |
cut -d '=' -f 2 | cut -d '&' -f 1