Как проверить, содержит ли строка подстроку в Bash

How Check If String Contains Substring Bash



Вопрос в том, как проверить, содержит ли строка подстроку в Bash. Ответ: используйте сопоставление с образцом. Это порождает другой вопрос: что такое сопоставление с образцом? Что ж, фраза в предложении имеет определенные характеристики. Вот почему он отличается от других фраз в том же предложении или в других предложениях. Характеристики могут быть закодированы в виде шаблона. Таким образом можно идентифицировать конкретную фразу в строке. В этой статье объясняется, как определить конкретную подстроку в более крупной строке, заменить совпавшую подстроку другой подстрокой и найти любую подстроку в более крупной строке по индексу. Однако, прежде чем углубляться в объяснения, нужно вспомнить различные способы создания строки в Bash.

Строка с экранированием пробелов

Строку можно создать, заменив каждый пробел 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, необходимо использовать сопоставление с шаблоном. Сопоставление с образцом выполняется не только в двойных скобках условия, [[. . . ]]. Это также может происходить в расширении параметра с его $ {. . .}. При расширении параметра можно получить подстроку по индексам.

В этой статье представлены наиболее важные моменты в сопоставлении с шаблоном. Есть еще! Однако то, что читателю следует изучить дальше, - это расширение имени файла.