Строка с экранированием пробелов
Строку можно создать, заменив каждый пробел escape-последовательностью пробела, ‘’; как в:
myVar= Туризм в Египет является одной из страны 's ведущие экономические отрасли.
выбросил $ myVar
Результат:
Туризм в Египте - одна из ведущих отраслей экономики страны.
Примечание: апостроф также использовал escape-последовательность пробела.
Строка одинарными кавычками
Есть ли у программиста время для экранирования всех пробелов в строке? Нет. Поэтому лучше использовать две одинарные кавычки для разделения строки; Такие как:
myVarзнак равно«Туризм в Египте - одна из стран» 'ведущие отрасли экономики.Строка в одинарных кавычках не позволяет раскрывать (заменять своим эффектом) любую escape-последовательность. К счастью, если две строки закодированы рядом друг с другом, они будут приняты как одна строка. Между ними может быть вставлена escape-последовательность, как это было сделано выше. Управляющая последовательность будет расширена. Таким образом, вывод становится:
Туризм в Египте - одна из ведущих отраслей экономики страны.
Строка в двойных кавычках
В двойных кавычках escape-последовательности также не раскрываются, но расширяются переменные. Следующий код иллюстрирует это:
myVar= Туризм в Египет является одной из страны 's ведущие экономические отрасли.выбросил $ myVar
Результат:
Туризм в Египте - одна из ведущих отраслей экономики страны.
Примечание: апостроф также использовал escape-последовательность пробела.
В этой статье основным рассматриваемым типом строки является строка в одинарных кавычках.
Основы регулярных выражений
Регулярное выражение
Рассмотрим эту строку:
Этот мир на самом деле не наш дом.
Пусть world будет интересующей нас подстрокой. Затем большая строка (целая строка) называется целевой строкой или просто целью. «Мир» в кавычках называется регулярным выражением или просто регулярным выражением. В данном случае содержание, мир - это образец.
Простое соответствие
В следующем коде, если слово «мир» встречается в целевом объекте, мы бы сказали, что слово было найдено.
пзнак равно«Этот мир на самом деле не наш дом».регзнак равно'Мир'
если [[ $ str= ~$ reg ]];тогда
выбросилнашел
еще
выбросилне найден
быть
= ~, который является оператором присваивания, за которым следует ~, называется оператором привязки. Условие проверяет соответствие шаблона целевой строке. Если подстрока, соответствующая шаблону, найдена в целевом объекте, оператор echo отображает найденное. Если он не найден, эхо-запрос будет эхом не найден. Вывод этого кода:
нашел
Как образец, мир, находится в цели. Обратите внимание, что разделительный пробел после [[и до]] был сохранен.
Шаблон
В приведенном выше коде «мир» в кавычках - это регулярное выражение, а сам мир - это шаблон. Это простой шаблон. Однако большинство шаблонов не так просты. Шаблон - это характеристика подстроки, которую нужно найти. Итак, шаблон Bash использует определенные метасимволы. Метасимвол - это персонаж, относящийся к другим персонажам. Например, Bash Pattern использует следующие метасимволы:
^ $ . * +? () [] {} |
Регулярное выражение также можно ввести в двойных скобках условия. Но не обязательно в кавычках. Итак, в данном случае это буквально узор.
Классы персонажей
Квадратных скобок
Обнаружен вывод следующего кода, означающий, что совпадение имело место:
пзнак равно«Кот вошел в камеру».если [[ $ str= ~[cbr]в]];тогда
выбросилнашел
быть
Шаблон [cbr] at соответствует cat, который начинается с «c», а продолжается и заканчивается на. [cbr] at означает соответствие 'c', 'b' или 'r', за которым следует at.
Обнаружен вывод следующего кода, означающий, что совпадение имело место:
пзнак равно«Летучая мышь вошла в камеру».если [[ $ str= ~[cbr]в]];тогда
выбросилнашел
быть
Шаблон, [cbr] at соответствует bat, который начинается с «b» и продолжается и заканчивается на. [cbr] at означает соответствие 'c', 'b' или 'r', за которым следует at.
Обнаружен вывод следующего кода, означающий, что совпадение имело место:
пзнак равно«Крыса вошла в камеру».если [[ $ str= ~[cbr]в]];тогда
выбросилнашел
быть
Шаблон [cbr] at соответствует rat, который начинается с «r» и продолжается и заканчивается на at.
В приведенных выше примерах кода программист не знает, существует ли в целевой строке кошка, летучая мышь или крыса. Но он знает, что подстрока начинается с «c», «b» или «r», затем продолжается и заканчивается на at. Квадратные скобки в шаблоне позволяют различным возможным символам соответствовать одному символу в позиции относительно других в целевом объекте. Итак, квадратные скобки содержат набор символов, один из которых соответствует подстроке. Наконец, сопоставляется полная подстрока.
Диапазон символов
В приведенном выше коде [cbr] - это класс. Даже если «c», «b» или «r» соответствует одному символу, если сразу после этого не совпадает, шаблон не будет совпадать ни с чем.
Что ж, есть определенные диапазоны, которые образуют класс. Например, от 0 до 9 цифр формируют класс, [0-9] с включенными 0 и 9. Строчные буквы от «a» до «z» образуют класс [a-z] с включенными «a» и «z». Заглавные буквы от «A» до «Z» образуют класс [A – Z] с включенными «A» и «Z». Из класса это один из символов, который соответствует одному символу в строке.
Следующий код дает совпадение:
если [[ 'ID8id'= ~[0-9] ]];тогдавыбросилнашел
быть
На этот раз целью является буквальная строка в условии. 8, которое является одним из возможных чисел в диапазоне [0-9], соответствует 8 в строке «ID8id». Приведенный выше код эквивалентен:
если [[ 'ID8id'= ~[0123456789] ]];тогдавыбросилнашел
быть
Здесь в шаблоне записаны все возможные числа, поэтому дефиса нет.
В следующем коде получено совпадение:
если [[ 'ID8iD'= ~[а-я] ]];тогдавыбросилнашел
быть
Соответствие осуществляется между строчной буквой «i» диапазона [a-z] и строчной буквой «i» целевой строки «ID8iD».
Помните: диапазон - это класс. Класс может быть частью более крупного паттерна. Таким образом, в шаблоне текст может быть впереди и / или после урока. Следующий код иллюстрирует это:
если [[ 'ID8id - это идентификатор'= ~ ID[0-9]я бы ]];тогдавыбросилнашел
быть
Результат: найден. «ID8id» из шаблона совпал с «ID8id» в целевой строке.
Отрицание
Соответствие не получается из следующего кода:
если [[ '0123456789101112'= ~[^0-9] ]];тогдавыбросилнашел
еще
выбросилне найден
быть
Результат:
не найден
Без ^ перед диапазоном в квадратных скобках ноль диапазона совпал бы с первым нулем целевой строки. Итак, ^ перед диапазоном (или необязательными символами) отменяет класс.
Следующий код производит совпадение, потому что условие гласит: сопоставить любой нецифровой символ в любом месте целевого объекта:
если [[ 'ABCDEFGHIJ'= ~[^0-9] ]];тогдавыбросилнашел
еще
выбросилне найден
быть
Итак, результат: найден.
[^ 0-9] означает не цифру, поэтому [^ 0-9] является отрицанием [0-9].
[^ a-z] означает букву не в нижнем регистре, поэтому [^ a-z] является отрицанием [a-z].
[^ A-Z] означает букву не в верхнем регистре, поэтому [^ A-Z] является отрицанием [A-Z].
Возможны и другие отрицания.
Точка (.) В шаблоне
Точка (.) В шаблоне соответствует любому символу, включая его самого. Рассмотрим следующий код:
если [[ '6759WXY.A3'= ~ 7,9 Вт.]];тогдавыбросилнашел
быть
Вывод кода найден, потому что другие символы совпадают. Одна точка соответствует «5»; другая точка соответствует «X»; и последняя точка соответствует точке.
Соответствующее чередование
Рассмотрим это предложение для целевой строки:
В клетке есть птицы разных видов.
Кто-то может захотеть узнать, есть ли у этой цели голубь, павлин или орел. Можно использовать следующий код:
пзнак равно«В клетке есть павлины разных видов».если [[ $ str= ~ голубь|павлин|орел]];тогда
выбросилнашел
еще
выбросилне найден
быть
Выход найден. Метасимвол чередования, | был нанят. Альтернатив может быть две, три, четыре и более. В этом коде совпало слово «павлин».
Группировка
В следующем шаблоне круглые скобки используются для группировки символов:
сцена (танцор)
Группа здесь - это сценический танцор, окруженный метасимволами (и). (танцор) - это подгруппа, а сцена (танцор) - это вся группа. Учтите следующее:
(Танцор потрясающий)
Здесь подгруппа или подстрока: танцор классный.
Подстроки с общими частями
Заинтересованное лицо - это лицо, заинтересованное в бизнесе. Представьте себе бизнес с веб-сайтом Stake.com. Представьте, что в компьютере есть одна из следующих целевых строк:
Веб-сайт Stake.com предназначен для бизнеса .;
Есть заинтересованное лицо .;
Заинтересованная сторона работает на Stake.com .;
Пусть любая из этих строк будет целью. Программист может захотеть узнать, находится ли stack.com или заинтересованное лицо в какой-либо целевой строке. Его образец был бы таким:
Stake.com | заинтересованная сторона
используя чередование.
Ставка была напечатана дважды в двух словах. Этого можно избежать, набрав шаблон следующим образом:
ставка (.com | держатель)
.com | Holder в данном случае является подгруппой.
Примечание: в этом случае используется знак чередования. stack.com или заинтересованное лицо по-прежнему будут искать. Обнаружен вывод следующего кода:
пзнак равно«Веб-сайт Stake.com создан для бизнеса».если [[ $ str= ~ ставка(.с участием|держатель) ]];тогда
выбросилнашел
быть
Соответствующая подстрока - stack.com.
Предопределенный массив BASH_REMATCH
BASH_REMATCH - это предопределенный массив. Предположим, что в шаблоне есть группы. Вся сопоставленная группа переходит в ячейку для индекса 0 этого массива. Первая подобранная подгруппа переходит в ячейку с индексом 1; вторая подгруппа совпадает, переходит в ячейку для индекса 2 и так далее. Следующий код показывает, как использовать этот массив:
пзнак равно«Танцовщица на сцене пришла».если [[ $ str= ~ этап (танцор) ]];тогда
выбросилнашел
быть
дляяв $ {! BASH_REMATCH [@]};делать
printf '$ {BASH_REMATCH [i]}, '
сделано
выбросил
Результат:
нашел
сценический танцор, танцор,
Вся группа танцует на сцене. Есть только одна подгруппа - танцоры.
Примечание: пробел в шаблоне был экранирован.
Согласование независимости верхнего / нижнего регистра
При сопоставлении, как объяснялось выше, учитывается регистр. Соответствие может быть выполнено независимо от случая. Это показано в следующем коде:
магазины -sнет совпаденияпзнак равно«Мы любим хорошую музыку».
если [[ $ str= ~ GoOd]];тогда
выбросилнашел
быть
магазины -uнет совпадения
Результат: найден. Шаблон такой, GoOd. Соответствующая подстрока является «хорошей». Обратите внимание, как опция nocasematch была включена в начале сегмента кода и отключена в конце сегмента кода.
Длина строки
Синтаксис для получения длины строки:
$ {# ПАРАМЕТР}Пример:
пзнак равно«Мы любим хорошую музыку».выбросил $ {# str}
Результат: 19.
Сокращение строк
Синтаксисы сокращения строки:
$ {ПАРАМЕТР: СМЕЩЕНИЕ}$ {ПАРАМЕТР: СМЕЩЕНИЕ: ДЛИНА}
где отсчет OFFSET начинается с нуля.
В следующем примере показано, как удалить первые 11 символов строки:
пзнак равно«Я всегда танцую под хорошую музыку».выбросил $ {str: 10}
Результат:
от хорошей музыки.
Отсчет ДЛИНЫ начинается со следующего символа. Следующий код показывает, как можно разрешить часть в строке:
пзнак равно«Я всегда танцую под хорошую музыку».выбросил $ {str: 10: 6}
Результат:
предок т
Первые 11 символов были удалены; следующие 6 символов были разрешены, а остальные символы были автоматически удалены.
Искать и заменить
Когда подстрока найдена, ее можно заменить другой подстрокой. Синтаксисы для этого:
кудазнак равно$ {ПАРАМЕТР / ШАБЛОН / ЗАМЕНА}кудазнак равно$ {ПАРАМЕТР // ШАБЛОН / ЗАМЕНА}
кудазнак равно$ {ПАРАМЕТР / ШАБЛОН}
кудазнак равно$ {ПАРАМЕТР // ШАБЛОН}
Для первого синтаксиса с одинарной косой чертой заменяется только первое совпадение. Пример:
пзнак равно«В камере крыса, летучая мышь и кошка».Правильнознак равно$ {str / [cbr] at / big cow}
выбросил $ str
выбросил $ ret
Результат:
В камере крыса, летучая мышь и кошка.
В камере большая корова, летучая мышь и кошка.
Для второго синтаксиса с двойной косой чертой заменяются все совпадения. Пример:
пзнак равно«В камере крыса, летучая мышь и кошка».Правильнознак равно$ {str // [cbr] at / big cow}
выбросил $ str
выбросил $ ret
Результат:
В камере крыса, летучая мышь и кошка.
В камере большая корова, большая корова и большая корова.
Для третьего синтаксиса с одинарной косой чертой нет замены для первого и единственного совпадения.
Также удаляется первая найденная подстрока. Пример:
пзнак равно«В камере крыса, летучая мышь и кошка».Правильнознак равно$ {str / [cbr] at}
выбросил $ str
выбросил $ ret
Для четвертого синтаксиса с двойной косой чертой нет замены для всех совпадений. Также удаляются все найденные подстроки. Пример:
пзнак равно«В камере крыса, летучая мышь и кошка».Правильнознак равно$ {str // [cbr] at}
выбросил $ str
выбросил $ ret
Результат:
В камере крыса, летучая мышь и кошка.
В камере есть a, a и a.
Заключение
Чтобы проверить, есть ли в строке подстрока в Bash, необходимо использовать сопоставление с шаблоном. Сопоставление с образцом выполняется не только в двойных скобках условия, [[. . . ]]. Это также может происходить в расширении параметра с его $ {. . .}. При расширении параметра можно получить подстроку по индексам.
В этой статье представлены наиболее важные моменты в сопоставлении с шаблоном. Есть еще! Однако то, что читателю следует изучить дальше, - это расширение имени файла.