Extrait de nom de fichier et le chemin d'accès à partir de l'URL dans le script bash
Dans mon script bash j'ai besoin d'extraire juste le chemin de l'URL donnée.
Par exemple, à partir de la variable contenant la chaîne:
http://login:[email protected]/one/more/dir/file.exe?a=sth&b=sth
Je veux extraire à une autre variable que l':
/one/more/dir/file.exe
partie. Bien sûr, login, mot de passe, nom de fichier et les paramètres sont facultatifs.
Depuis, je suis nouveau sur sed et awk-je vous demander de l'aide. S'il vous plaît, me conseiller comment le faire. Merci!!!!
- Jetez un oeil à http://stackoverflow.com/questions/27745/getting-parts-of-a-url-regex
- Double question: 27745
- Si l'OP demande une réponse à l'aide de bash, awk et/ou sed, ceux sont les langues que les réponses doivent cible. Je suis tomber malade de cette "la substitution de la langue de votre choix" sur DONC. J'ai récemment posé une question à propos de Javascript sans un cadre parce que je savais que la plate-forme, j'ai été cibler de ne pas le soutenir. Mais je n'ai eu une discussion au sujet de pourquoi je ne pouvais pas utiliser jQuery. Aussi, une fois, j'ai été en développement sur un dispositif intégré et Perl par exemple n'a pas été installé, j'ai donc besoin de faire ces sortes de choses avec awk. Afin de répondre aux questions à l'aide de l'OP langue(s), ou de ne pas répondre à tous.
- Cela dépend de votre défaut. Dans votre cas, vous avez par défaut "d'assumer toutes les exigences pas précisé dans la question sont explicitement interdits'. Dans ce cas, l'affiche est un novice avec regexes, et presque certainement ne se soucie pas de savoir si la réponse est dans sed/awk, perl, ou tout autre outil standard. En dehors de spécialisé périphériques intégrés, il n'existe aucun argument pour 'Perl ne peut pas être présents sur la plateforme. Il doit DONC être un outil d'apprentissage et comme un moyen d'obtenir des réponses précises. Le fait que l'OP a accepté un Perl réponse parle d'elle-même. Vos votes négatifs sont une erreur.
- vous ne pourriez pas être plus faux que mon "votes négatifs sont une erreur" Cette question de balises contiennent bash, awk & sed. J'ai été amené ici par une recherche sur l'un de ceux-ci ou de l'autre, j'ai oublié laquelle. Mais je ne devrais pas avoir à parcourir des réponses à l'aide de Perl, Ruby ou quoi que ce soit d'autre que la question n'est pas identifié avec, pour trouver l'information pertinente pour la recherche, j'ai couru. En effet, je affirment que c'est complètement contraire à la volonté de la SORTE, comme il existe actuellement, pour répondre à des questions en utilisant des langues que l'OP n'a pas précisé.
Vous devez vous connecter pour publier un commentaire.
Dans bash:
Ne fonctionne que si l'URL commence par
http://
ou d'un protocole avec la même longueurSinon, c'est probablement plus facile d'utiliser les regex avec
sed
,grep
oucut
...example output
. par exemple, ici.. une ligne simple, est tout ce qui est nécessaire...↳/one/more/dir/file.exe
/one/more/dir/file.exe
, vous pouvez le mettre dans une variable si vous le souhaitez:MYVAR="/one/more/dir/${AFTER_SLASH%%\?*}"
http://
ou d'un protocole avec la même longueur)URL_NOPRO=${URL#*//}
. Qui va travailler avechttp://
,https://
,ftp://
, mais pas avecfile:///
(ne peut pas gérer 3 barres obliques).Il y a des fonctions intégrées dans bash pour gérer cela, par exemple, la chaîne correspondant au modèle d'opérateurs:
Par exemple:
Tout cela à partir de l'excellent livre: "Un Guide Pratique pour les Commandes de Linux, les Éditeurs, et la Programmation Shell par Mark G. Sobell (http://www.sobell.com/)
printf -- "%s" "${URL##*/}"
- qui permettra d'éliminer tout ce qui conduit jusqu'à la finale "/" et indépendantes.printf -- "%s" "${url##*/}" | sed 's/?.*//'
qui remplace l'option ? et rien après avec rien.npm install -g
pour quand j'ai installer un nouveau nœud version. J'ai essayé tout de tuyauterie àpbcopy
et le coller aprèsnpm install -g
, mais je reçois un tas d'échecs.ls | xargs npm install
. J'ai trouvé xargs un peu difficile pour envelopper ma tête autour au premier abord, mais c'est vraiment puissant pour le "dosage" des commandes sur plusieurs fichiers.Il utilise bash et couper comme une autre manière de faire. C'est moche, mais ça fonctionne (au moins pour l'exemple). Parfois, j'aime à utiliser ce que j'appelle couper tamis à réduire l'information que je suis actuellement à la recherche pour.
Remarque: Performance sage, cela peut être un problème.
Compte tenu de ces mises en garde:
Laissez-moi d'abord l'écho de la la ligne:
Qui nous donne:
Puis nous allons couper la ligne à la @ comme un moyen pratique pour dépouiller le http://login:password:
Qui nous donne ceci:
Pour se débarrasser du nom d'hôte, nous allons faire un autre couper et l'utilisation de la / comme délimiteur tout en demandant à couper à nous donner le deuxième champ et tout ce qui suit (essentiellement, à la fin de la ligne). Il ressemble à ceci:
Qui, à son tour, entraîne:
Et enfin, nous voulons dépouiller tous les paramètres à partir de la fin. Encore une fois, nous allons utiliser couper et cette fois, les ? comme délimiteur et dites-lui de nous donner juste le premier champ. Ce qui nous amène à la fin et ressemble à ceci:
Et la sortie est:
Juste une autre façon de faire et de cette approche est un moyen de réduire l'écart que les données que vous n'avez pas besoin d'une manière interactive à venir avec quelque chose que vous avez besoin.
Si je voulais des trucs de ce dans une variable dans un script, j'aimerais faire quelque chose comme ceci:
Espère que cela aide.
GNU
grep
BSD
grep
ripgrep
Pour obtenir d'autres parties de l'URL, vérifiez: L'obtention de pièces d'une URL (Regex).
gawk
sortie
Si vous avez un gawk:
ou
Gnu awk peut utiliser l'expression régulière comme séparateurs de champ(FS).
Comment cela 😕
L'extrait de code Perl est intrigante, et depuis Perl est présent dans la plupart des distributions Linux, tout à fait utile, mais...Il ne veut pas faire le travail complètement. Plus précisément, il y a un problème dans la traduction de l'URL/URI format UTF-8 dans le chemin de l'Unicode. Permettez-moi de donner un exemple de problème. L'URI originale peut être:
Le chemin d'accès correspondant serait:
%20
est devenu l'espace,%C3%A9
est devenu 'é'. Est-il une commande Linux, bash fonction ou un script Perl qui peut gérer cette transformation, ou dois-je écrire une énorme série de sed sous-chaîne de substitutions? Que dire de l'inverse de la transformation, à partir du chemin d'URL/URI?(Suivi)
Regardant http://search.cpan.org/~gaas/URI-DE 1,54/URI.pm, j'ai d'abord vu le as_iri méthode, mais c'était apparemment absent de mon Linux (ou n'est pas applicable, en quelque sorte). S'avère la solution est de remplacer le "->chemin" avec "->file". Vous pouvez ensuite pause que d'autres vers le bas à l'aide de basename et dirname, etc. La solution est donc:
Curieusement, à l'aide de "->dir" au lieu de "->file" n'est PAS un extrait de l'annuaire de la partie: au contraire, il met l'URI de sorte qu'il peut être utilisé comme un argument pour mkdir et la comme.
(Suivi)
Aucune raison pour que la ligne ne peut pas être réduit à cela?
Meilleur pari est de trouver un langage qui a une URL de l'analyse de la bibliothèque:
ou
Je suis d'accord que "couper" est un merveilleux outil en ligne de commande. Toutefois, une plus purement bash solution est d'utiliser une fonctionnalité puissante de l'expansion des variables dans bash. Par exemple:
J'ai écrit une fonction qui va extraire tout ou partie de l'URL. Je ne l'ai testé en bash. Utilisation:
exemple:
code:
En utilisant uniquement bash les builtins:
Ce que ce n'est:
*://*/
(donc ce serait votre protocole et le nom d'hôte+port)/
remarque: les guillemets ne sont pas nécessaires ici, mais je le trouve plus facile à lire avec eux dans
Cette perl one-liner qui fonctionne pour moi sur la ligne de commande, donc pourrait être ajouté à votre script.
Noter que cela suppose, il y aura toujours un caractère"? " à la fin de la chaîne que vous souhaitez extraire.