Совпадение URL-ссылки из входной строки - PullRequest
2 голосов
/ 07 февраля 2010

Как мне сопоставить URL-адрес в этой строке, у меня есть другой код, который соответствует тексту, и он, кажется, работает, но когда я пытаюсь использовать его здесь, это не так, он постоянно говорит, что "Нет такого файла или каталог. Я не знал, что grep -o работал только с файлами?

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

В любом случае, не могли бы вы помочь мне с сопоставлением URL-адреса из переменной "matchString" (для этого не нужно использовать grep).

Предпочитаемый вывод: http://www.google.com/

Ответы [ 2 ]

5 голосов
/ 07 февраля 2010

Вам нужно echo по струне через трубу grep:

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

Grep читает из файла или стандартного ввода. Он не принимает строковый аргумент для поиска внутри.

Кроме того, grep будет выводить все совпадение, а не часть в скобках. Вам, вероятно, нужно использовать sed.

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

Команда sed работает следующим образом:

  • s/// - команда замены и ее разделители. Вы можете использовать другой разделитель для удобства, если он делает выражение более читабельным или помогает избежать необходимости выполнять экранирование. Между первыми двумя разделителями есть то, что мы хотим изменить. Между средним и последним - то, что мы хотим изменить.

  • url={"urlPath":" - это буквальный текст, который мы используем для сопоставления

  • \( \) включает группу захвата. То, что падает здесь, - это то, что мы хотим поймать.

  • [^"] соответствует любому символу, который не является двойной кавычкой

  • \+ соответствует одному или нескольким предыдущим образцам. Итак, в данном случае это один или несколько символов, которые не являются кавычками.

  • .* соответствует нулю или более любого символа. В этом случае он начинается с кавычки после google.com/ и продолжается до конца строки.

  • \1 выводит то, что было захвачено первой (и только в этом случае) группой захвата.

Визуально:

url={"urlPath":"       http://www.google.com/       ","thisIsOtherText"
-----literal----       -------non-quote------       ---any character---
url={"urlPath":"   \(  [^"]                    \)   .*
0 голосов
/ 07 февраля 2010

Я не знаком с grep, но знаю регулярные выражения.

Возможно, вам придется добавить escape-символы для "

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