Comment puis-je extraire seulement
http://www.youtube.com/watch?v=qdRaf3-OEh4
à partir d'une URL comme
http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main
Je ne m'intéresse qu'au paramètre "v".
Mise à jour:
Les meilleurs seraient:
sed 's/^.\+\(\/\ |\&\| \? \) v =\([^\&] * \). */\ 2 /' awk 'match ($ 0,/((\/| & | \?) v =) ([^ &] *) /, x) {print x [3]}' grep -Po '( ? <= (\/| & | \?) v =) [^ &] * ' # Dire correspondance/ou & puis v =
RFC 3986 déclare:
URI = scheme ":" hier-part ["?" requête] ["#" fragment] requête = * (pchar/"/"/"?") fragment = * (pchar/"/"/"?" ) pchar = non réservé/pct-codé/sous-delims/":"/"@" sans réserve = ALPHA/DIGIT/"-"/"."/"_"/"~" sous-delims = "!"/"$"/"&"/"'"/"("/")" /"*"/"+"/","/";"/"=" …
Donc, pour être sûr d'utiliser:
| sed 's/#.*//' | - to remove #fragment part
devant.
C'est à dire.
| sed 's/#.*//' | grep -Po '(?<=(\/|&)v=)[^&]*'
echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main'\ | sed 's/^.\+\Wv =\([^\&] * \). */\ 1 /'
Explication:
's /… /…// THIS/WITH THIS / ' substitue/MATCH 0 ou PLUS CHOIX et groupez-les ()/WITH THIS / +-------------------------- s _s_ubsititute | + -------------------------/START MATCH || + ----/END MATCH || | + -\1 REMPLACER PAR -\1 == Groupe 1. Ou FIRS bas (). || | | + -/Fin de SUBSTITUT S/^.\+\Wv =\([^\&] * \). */\ 1 /' +++ - + - + - + - + ----- + - + ------- ^ Correspondance depuis le début de la ligne ++ - + - + - + - + ----- + - + --- ---- Faites correspondre n'importe quel caractère + - + - + - + - + ----- + - + -------\+ plusieurs fois (grep (+/* *? Etc) glouton) + - + - + - + ----- + - + -------\W Caractère autre que le mot + - + - + ----- + - + ------- v = correspond littéralement à "v =" + - + ----- + - + -------\(Démarrer MATCH GROUP + - ---- + - + ------- [^\&] * Faites correspondre n'importe quel caractère MAIS & - autant que possible + - + ------- \) Terminez MATCH GROUP + -------. * Faites correspondre n'importe quoi; * Autant de fois que possible - aka fin de ligne; comme il n’existe pas de [abc] correspondrait à un OR b OR c [abc] * correspondrait à un AND/OU b ET/OU c - autant de fois que possible, [^ Abc] correspondrait à tout, MAIS a, b ou c /\ 1/Remplacez TOUTE correspondance par MATCH GROUP numéro 1. Ce serait - tout ce qui est entre\(et \) - ce qui est autre chose que "&" après la chaîne littérale "v =" - qui à son tour comporte une lettre autre que Word devant. Cela signifie également qu’aucune correspondance ne signifie aucune substitution qui ne donne finalement pas de changement.
Résultat: qdRaf3-OEh4
Remarque: Si aucune correspondance , toute la chaîne sera renvoyée.
echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main'\ | awk 'match ($ 0,/(\ Wv =) ([^ &] *) /, v) {print v [2]}'
Résultat: qdRaf3-OEh4
Explication:
In Awk match(string, regexp)
est une fonction qui recherche la correspondance la plus longue et la plus à gauche de l'expression rationnelle dans la chaîne. Ici, j'ai utilisé une extension fournie avec Gawk. (voir Awk , GAwk ; MAwk etc.) place les correspondances individuelles - c'est-à-dire: ce qui est entre parenthèses - dans un tableau de correspondances.
Le motif est assez semblable à celui de Perl/Grep ci-dessous.
+ ------------------------------------------ Construit en fonction | + --------------------------------- Entrée entière (1 $ aurait été classé 1) | | etc. (Utilisation des délimiteurs par défaut "" *) | | | | | | (....) (....) ------------------ Place\Wv = dans un groupe 1 et [^ &] * groupe 2. correspond (0 $,/(\ Wv =) ([^ &] *) /, v) {print v [2]} | | | | | | + - + ---- Utilisez "v" à partir de /, v; v est un nom défini par l'utilisateur | | + ---- 2 spécifie l'index dans v, qui est un groupe de | | ce qui est entre () dans /…/ | | | + ----------- L’impression est une autre fonction intégrée. + --------------- Nom du groupe que l’on peut utiliser pour l’impression.
echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' |\ grep -Po '(? <=\Wv =) [^ &] *'
Résultat: qdRaf3-OEh4
Explication:
- P Utiliser la compatibilité Perl - o N'afficher que la correspondance d'impression de l'expression. - Cela signifie: De notre motif, imprimer/retourner uniquement ce à quoi il correspond. Si rien ne correspond; ne renvoie rien. + ------- ^ Inverser les maths sur - ne correspond pas (SEULEMENT comme il est PREMIER entre []) | + ---- - & Un caractère "&" littéral || (? <=\Wv =) [^ &] * | | | | || | | | | | + ---- * Gourmand; autant de fois que possible. | | | + - + ----- [] Ordre sauvage/n'importe quel ordre de ce qui est à l'intérieur [] | | + ----------- v = littéral v = | + -------------\W Caractère autre que mot + ----------------- (? <= Ce qui suit devrait être (médiatement) précédé de. ? = Huh, <= à gauche, = = égal à Donc: Matchal "v =" où "v" est précédé d'un non Ensuite, faites correspondre n'importe quel caractère : Autant de fois que possible jusqu'à la fin de la ligne ou jusqu'à ce que vous rencontriez un "&". Comme vous ne pouvez pas vous en procurer "&" dans une URL entre des paires clé/valeur doit être OK.
echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' | sed -e 's/&.*//' -e 's/.*watch?//'
vous obtiendrez v=qdRaf3-OEh4
.