Я новичок в shell-скрипты. Я хочу отправить HTTP-запрос с помощью curl и затем извлечь некоторые строки, используя регулярные выражения. Например, как я могу извлечь имя домена с HTTP-ответа? (Пример исключительно для обучающих целей)
#!/bin/bash
name=$(curl google.com | grep "www\..*com")
echo "domain name is"
echo $name
Используя Баш регулярные выражения:
re="http://([^/]+)/"
if [[ $name =~ $re ]]; then echo ${BASH_REMATCH[1]}; fi
Редактировать - ОП попросил объяснения синтаксиса. Синтаксис регулярных выражений - это большая тема, которой я могу'т объяснить в полной мере, но я постараюсь достаточно объяснить, чтобы понять на примере.
re="http://([^/]+)/"
Это регулярное выражение сохраняется в переменной в bash, ре
- т. е. то, что вы хотите, чтобы ваш входной строки, чтобы соответствовать, и надеюсь извлечь подстроку. Разбив его вниз:
[]
Обычно квадратные скобки используются, говорит: "любой символ в скобках, что". Так с[АО -] Т
будут соответствовать как "кошка" и "кроватка" по. Символ ^
в []
изменяет это, чтобы сказать: "любой символ, за исключением ** в квадратных скобках. Так что в данном случае [^/]
будет соответствовать любому символу отдельно от "/" по.[ ^ / ] +
соответствует 1 или более из множества всех символов, кроме как "/" по.()
скобки подвыражения говорит, что вы хотите сохранить все, что совпадает с тем, что выражения для последующей обработки. Если язык, который вы используете, поддерживает, это даст какой-то механизм, чтобы получить эти частичные совпадения. Для bash, это BASH_REMATCH массива.Далее мы должны проверить входную строку на регулярное выражение, чтобы увидеть, если он соответствует. Мы можем использовать Баш условное, чтобы сделать это:
if [[ $name =~ $re ]]; then
echo ${BASH_REMATCH[1]}
fi
В bash, в [[ ]]
задать расширенный условный тест, и может содержать =~
Баш оператор регулярного выражения. В этом случае мы проверяем, является ли входная строка $имя
соответствует регулярному выражению $ре
. Если она не совпадает, то из-за строительства регулярного выражения, мы гарантируем, что у нас будет частичное совпадение (от скобки ()
), и мы можем открыть его с помощью BASH_REMATCH массива:
${BASH_REMATCH[0]}
будет вся строка соответствует регулярному выражению, т. е. на "http://www.google.com/".()
в регулярное выражение - элементы BASH_REMATCH будут соответствовать этим в порядке. Так что в данном случае
${BASH_REMATCH1}` будет содержать "и www.google.com" я думаю, что это строка, которую вы хотите.Обратите внимание, что содержание BASH_REMATCH массива применяются только в последний раз, когда оператор регулярного выражения =~
был использован. Так что если вы идете к более регулярному выражению, ты должен сохранить содержимое нужно из этого массива каждый раз.
Это может показаться пространное описание, но я действительно умалчивается некоторые тонкости регулярных выражений. Они могут быть довольно мощным, и я считаю, с достойной производительностью, но синтаксис регулярных выражений является сложным. Также реализациях регулярных выражений различаются, поэтому разные языки будет поддерживать различные функции и могут иметь тонкие различия в синтаксисе. В частности, экранирование символов в регулярное выражение может оказаться непросто, особенно если эти персонажи могли бы в противном случае иной смысл в данном языке.
Обратите внимание, что вместо создания переменной $ре
на отдельной строке и ссылаясь на эту переменную в условии, можно поставить регулярное выражение прямо в состоянии. Однако в Баш 3.2, правила были изменены в отношении того, требуется ли кавычки вокруг такой литерал регулярного выражения или нет. Ввод регулярного выражения в отдельную переменную-это простой способ обойти это, так что условие работает, как ожидалось во всех Баш версии, которые поддерживают оператор матч=~
.
Один из способов-с СЭД
. Например:
echo $name | sed -e 's?http://www\.??'
Обычно СЭД
регулярные выражения разделяются символом `/', но вы можете использовать '?', поскольку вы'вэ искал '/'. Здесь'с другой Баш трюк. @DigitalTrauma'ы ответ напомнил мне, что я должен предложить это. Это'ы похожие:
echo ${name#http://www.}
(DigitalTrauma также получает кредит для того, чтобы напоминать мне, что "http://" должен быть обработан.)