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$2
etc até$N
. Por padrão,awk
usa 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 queawk
deve usar tanto&
quanto=
como delimitadores de campo. -
Portanto, considerando a string de entrada da sua pergunta, usando
&
e=
como delimitadores,awk
lerá os seguintes campos:http://www.youtube.com/watch?v=abc&g=xyz |----------- $1 -------------| --- - --- | | | | | ̣----- $4 | -------- $3 ----------- $2
Entã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