2010-02-07 4 views
2

Comment faire correspondre l'adresse URL dans cette chaîne, j'ai un autre code qui correspond au texte et il semble fonctionner, mais quand j'essaie de l'utiliser ici, il ne le fait pas, il ne cesse de le dire il est « Aucun fichier ou répertoire. Je ne savais pas grep -o seulement travaillé sur les dossiers?Faire correspondre le lien URL de la chaîne de saisie

matchString='url={"urlPath":"http://www.google.com/","thisIsOtherText"' 
array=($(grep -o 'url={"urlPath":"([^"]+)"' "$matchString")) 
grep: url={"urlPath":"http://www.google.com/","thisIsOtherStuff": No such file or directory 

Quoi qu'il en soit, pourriez-vous s'il vous plaît me aider avec l'URL correspondant de la « variable matchString »(il doesn « t doivent utiliser grep)

sortie préférée:. http://www.google.com/

Répondre

5

Vous devez echo la chaîne par un tuyau à grep.

array=($(echo "$matchString" | grep -o 'url={"urlPath":"([^"]+)"')) 

Grep lit à partir d'un fichier ou l'entrée standard Il n'accepte pas un argument de chaîne pour effectuer une recherche à l'intérieur.

De même, grep va afficher la totalité de la correspondance, pas la partie entre parenthèses. besoin d'utiliser sed.

array=($(echo "$matchString" | sed 's/url={"urlPath":"\([^"]\+\).*"/\1/')) 

La commande fonctionne sed comme ceci:

  • s/// est la commande de remplacement et de ses délimiteurs. Vous pouvez utiliser un autre délimiteur pour plus de commodité s'il rend l'expression plus lisible ou permet d'éviter d'avoir à faire quelques échappées. Entre les deux premiers délimiteurs est ce que nous voulons changer. Entre le milieu et le dernier est ce que nous voulons le changer.

  • url={"urlPath":" est que le texte littéral que nous utilisons pour aider à faire le match

  • \(\) enserre un groupe de capture. Ce qui tombe ici est ce que nous voulons nous accrocher.

  • [^"] correspond à tout caractère n'est pas un guillemet

  • \+ apparier un ou plusieurs du motif précédent. Donc, dans ce cas, c'est un ou plusieurs caractères qui ne sont pas des guillemets.

  • .* correspond à zéro ou plus de n'importe quel caractère. Dans ce cas, il commence à la citation après google.com/ et va à la fin de la chaîne.

  • \1 génère ce qui a été capturé par le premier groupe de capture (et seulement dans ce cas).

visuellement:

 
url={"urlPath":"  http://www.google.com/  ","thisIsOtherText" 
-----literal----  -------non-quote------  ---any character--- 
url={"urlPath":" \( [^"]     \) .* 
+0

A la vôtre, la sed fonctionne. Je ne sais pas comment mon autre code fonctionne avec le grep, même si je pense que ce pourrait être un fichier. – Mint

+0

Aussi pourriez-vous s'il vous plaît expliquer comment l'expression rationnelle dans tout cela fonctionne et le \ 1? – Mint

+0

Merci! Très détaillé Je vous donnerais deux tiques si je le pouvais :) – Mint

0

Je ne connais pas avec grep, mais ont une connaissance de regex.

Vous devrez peut-être ajouter les évasions avec pour la "

array=($(grep -o 'url\=\{\"urlPath\"\:\"([^\"]*)\"' "$matchString")) 
+0

utilisateur: ~ # array = ($ (grep -o « url \ = \ {\ "URLPath \" \: \ "([^ \"] *) \ "'" $ matchString ")); echo" $ array " grep: Unmatched \ { utilisateur: ~ # array = ($ (grep -o' url \ = {\" urlPath \ "\: \" ([^ \ "] *) \" '"$ matchString")); echo "$ array" grep:: Aucun fichier ou répertoire de ce type – Mint

Questions connexes