Linux bash поиск подстроки

How to Check if String Contains a Substring in Bash

In this bash string tutorial, you’ll learn to check whether a given string contains a substring or not.

So, you have a long string and you want to check of this string contains a substring in your bash script.

There are more than one way to check for substrings in bash shell. I’ll show some simple examples first, followed by a cool bash script that uses this concept in a real-world scenario.

Checking for substring in bash using if else statement

If you are familiar with the conditional statements in bash, you can use it to check if a string contains the substring in the following manner:

Simple example for checking substring

The double brackets are necessary here. I consider this to be the native way because it does not use any other tool. Let me explain the above snippet with proper example.

Initialize a variable with a long string:

[email protected]:~$ fullstring="This is a string with a stretch" 

Now, store the word “stretch” inside a variable called substr1 :

Let’s make the substring comparison:

[email protected]:~$ if [[ $fullstring == *"$substr"* ]]; then

Here, * means zero or more characters. I hope you are familiar with the concept of quotes in bash scripting. The $substr inside the quotes replaces it with its value.

Basically, you are checking if the full string matches xxxxsubstrxxxx type of pattern.

You could also use the substring directly instead of using it through a variable like this:

[email protected]:~$ if [[ $fullstring == *"stretch"* ]]; then

You get the gist. Let me complete this script with else statement that shows an alternate message if the substring is not found:

#!/bin/bash fullstring="This is a string with a stretch" substr="stretch" if [[ $fullstring == *"$substr"* ]]; then echo "Found $substr!" else echo "$substr not found!" fi 

You can easily see that if you run the above shell script, it will find the substring.

[email protected]:~$ bash substr.sh Found stretch!

A better real world example for finding substring in bash

Substrings can be very helpful in scripts to “interact” with users. Use the read command to let your bash script accept user input.

echo "Hey there..what is your name?" read Name echo "Hello "$name"! The Matrix Resurrections trailer is here! Is your pill Red or Blue?" read Pill if [[ $Pill == *"Red"* || $Pill == *"red"* ]]; then echo "Welcome..to the real world "$Name"!" else echo "Wake Up "$Name"!" fi 

Give it executable permission and execute the script:

[email protected]:~$ chmod +x makeyourchoice.sh [email protected]:~$ ./makeyourchoice.sh

Output for the above script:

Hey there..what is your name? avimanyu Hello avimanyu! The Matrix Resurrections trailer is here! Is your pill Red or Blue? I have Red pill Welcome..to the real world avimanyu! 

Here, I made the if condition slightly better by taking care of two probable chances of case sensitivity. Only Red is the substring here. But red is a possible input too. So, I added another condition. || indicates “or”. If you enter Red , it is a substring. But even though red is not one, I had to add it.

Читайте также:  Linux info about directory

Finding substring in bash using grep command

Here’s another way for finding substring in a string in bash. Use the grep command in this manner:

The q options means grep will be in quiet mode, not showing any output. Please mind that there are 3

I hope this quick tutorial helped you in looking for a specific substring within a string. If you have questions or suggestions, feel free to leave a comment below. Btw..which pill did you choose? Did you make your choice?

Источник

Linux bash поиск подстроки

Bash поддерживает на удивление большое количество операций над строками. К сожалению, этот раздел Bash испытывает недостаток унификации. Одни операции являются подмножеством операций подстановки параметров, а другие — совпадают с функциональностью команды UNIX — expr. Это приводит к противоречиям в синтаксисе команд и перекрытию функциональных возможностей, не говоря уже о возникающей путанице.

stringZ=abcABC123ABCabc echo $ # 15 echo `expr length $stringZ` # 15 echo `expr "$stringZ" : '.*'` # 15
#!/bin/bash # paragraph-space.sh # Вставка пустых строк между параграфами в текстовом файле. # Порядок использования: $0 if [ "$len" -lt "$MINLEN" ] then echo # Добавление пустой строки после последней строки параграфа. fi done exit 0
stringZ=abcABC123ABCabc # |------| echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8 echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8

Index expr index $string $substring Номер позиции первого совпадения в $string c первым символом в $substring.

stringZ=abcABC123ABCabc echo `expr index "$stringZ" C12` # 6 # позиция символа C. echo `expr index "$stringZ" 1c` # 3 # символ 'c' (в #3 позиции) совпал раньше, чем '1'.

Эта функция довольно близка к функции strchr() в языке C.

stringZ=abcABC123ABCabc # 0123456789. # Индексация начинается с 0. echo $ # abcABC123ABCabc echo $ # bcABC123ABCabc echo $ # 23ABCabc echo $ # 23A # Извлекает 3 символа. # Возможна ли индексация с "правой" стороны строки? echo $ # abcABC123ABCabc # По-умолчанию выводится полная строка. # Однако . . . echo $ # Cabc echo $ # Cabc # Теперь выводится правильно. # Круглые скобки или дополнительный пробел "экранируют" параметр позиции. # Спасибо Dan Jacobson, за разъяснения.

Если $string — » * » или » @ » , то извлекается до $length позиционных параметров (аргументов), начиная с $position.

echo $ # Вывод 2-го и последующих аргументов. echo $ # То же самое. echo $ # Вывод 3-х аргументов, начиная со 2-го.

expr substr $string $position $length Извлекает $length символов из $string, начиная с позиции $position.

stringZ=abcABC123ABCabc # 123456789. # Индексация начинается с 1. echo `expr substr $stringZ 1 2` # ab echo `expr substr $stringZ 4 3` # ABC
stringZ=abcABC123ABCabc # ======= echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..7\)'` # abcABC1 echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..6\)'` # abcABC1 echo `expr "$stringZ" : '\(. \)'` # abcABC1 # Все вышеприведенные операции дают один и тот же результат.

expr match «$string» ‘.*\($substring\)’ Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение. Поиск начинается с конца $string. expr «$string» : ‘.*\($substring\)’ Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение. Поиск начинается с конца $string.

stringZ=abcABC123ABCabc # ====== echo `expr match "$stringZ" '.*\([A-C][A-C][A-C][a-c]*\)'` # ABCabc echo `expr "$stringZ" : '.*\(. \)'` # ABCabc

Удаление части строки $ Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки $ Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки

stringZ=abcABC123ABCabc # |----| # |----------| echo $ # 123ABCabc # Удаление самой короткой подстроки. echo $ # abc # Удаление самой длинной подстроки.

$ Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки $ Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки

stringZ=abcABC123ABCabc # || # |------------| echo $ # abcABC123ABCa # Удаляется самое короткое совпадение. Поиск ведется с конца $stringZ. echo $ # a # Удаляется самое длинное совпадение. Поиск ведется с конца $stringZ.

Пример 9-11. Преобразование графических файлов из одного формата в другой, с изменением имени файла

#!/bin/bash # cvt.sh: # Преобразование всех файлов в заданном каталоге, #+ из графического формата MacPaint, в формат "pbm". # Используется утилита "macptopbm", входящая в состав пакета "netpbm", #+ который сопровождается Brian Henderson (bryanh@giraffe-data.com). # Netpbm -- стандартный пакет для большинства дистрибутивов Linux. OPERATION=macptopbm SUFFIX=pbm # Новое расширение файла. if [ -n "$1" ] then directory=$1 # Если каталог задан в командной строке при вызове сценария else directory=$PWD # Иначе просматривается текущий каталог. fi # Все файлы в каталоге, имеющие расширение ".mac", считаются файлами #+ формата MacPaint. for file in $directory/* # Подстановка имен файлов. do filename=$ # Удалить расширение ".mac" из имени файла #+ ( с шаблоном '.*c' совпадают все подстроки #+ начинающиеся с '.' и заканчивающиеся 'c', $OPERATION $file > "$filename.$SUFFIX" # Преобразование с перенаправлением в файл с новым именем rm -f $file # Удаление оригинального файла после преобразования. echo "$filename.$SUFFIX" # Вывод на stdout. done exit 0 # Упражнение: # -------- # Сейчас этот сценарий конвертирует *все* файлы в каталоге # Измените его так, чтобы он конвертировал *только* те файлы, #+ которые имеют расширение ".mac".

Замена подстроки $ Замещает первое вхождение $substring строкой $replacement. $ Замещает все вхождения $substring строкой $replacement.

stringZ=abcABC123ABCabc echo $ # xyzABC123ABCabc # Замена первой подстроки 'abc' строкой 'xyz'. echo $ # xyzABC123ABCxyz # Замена всех подстрок 'abc' строкой 'xyz'.

$ Подстановка строки $replacement вместо $substring. Поиск ведется с начала строки $string. $ Подстановка строки $replacement вместо $substring. Поиск ведется с конца строки $string.

stringZ=abcABC123ABCabc echo $ # XYZABC123ABCabc # Поиск ведется с начала строки echo $ # abcABC123ABCXYZ # Поиск ведется с конца строки
#!/bin/bash # substring-extraction.sh String=23skidoo1 # 012345678 Bash # 123456789 awk # Обратите внимание на различия в индексации: # Bash начинает индексацию с '0'. # Awk начинает индексацию с '1'. echo $ # с 3 позиции (0-1-2), 4 символа # skid # В эквивалент в awk: substr(string,pos,length). echo | awk ' < print substr("'"$"'",3,4) # skid > ' # Передача пустого "echo" по каналу в awk, означает фиктивный ввод, #+ делая, тем самым, ненужным предоставление имени файла. exit 0

Источник

Читайте также:  Find hidden file on linux

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

Как в Bash можно протестировать, содержит ли она другую строку?

Рассмотрим сразу несколько вариантов, с использованием различных программ: какие-то будут быстрее или медленнее, какие-то решения будут работать только в Bash, а некоторые в любой оболочке Linux.

1.

Вариант с обрамлением строки подстановочными символами:

string='Моя длинная строка' if [[ $string == *"Моя длинная"* ]]; then echo "Подстрока найдена!" fi

Обратите внимание, что пробелы в искомой подстроке должны быть заключены в двойные кавычки, а звёздочки должны быть снаружи — в точности как на примере. Также обратите внимание, что используется простое сравнение (то есть ==), а не оператор регулярных выражений (то есть не =~).

Также не забывайте делать пробелы до и после квадратных скобок.

Если поменять строки местами, то для проверки поменяйте == на != и результат будет точно таким же.

2.

Вариант с регулярными выражениями

string=Моя строка'; if [[ $string =~ "Моя" ]] then echo "Подстрока найдена!" fi

Чтобы проверить, что строка НЕ содержит подстроку:

Пример выше вернёт true.

3.

Похожего эффекта можно добиться и с выражением case:

case "$string" in *foo*) # Do stuff ;; esac

Это решение является портативным на оболочки posix (то есть это не башизм).

4.

Следующая функция возвращает True или False в зависимости от того, содержит ли одна строка другую или нет. То есть эту

stringContain 'ИСКОМАЯ ПОДСТРОКА' 'БОЛЬШАЯ СТРОКА'
stringContain() < [ -z "$1" ] || < [ -z "$" ] && [ -n "$2" ];>;>; if stringContain 'bcd' 'abcdef'; then echo yes; else echo no; fi yes

Пример, когда подстрока не найдена:

stringContain() < [ -z "$1" ] || < [ -z "$" ] && [ -n "$2" ];>;>; if stringContain 'ddd' 'abcdef'; then echo yes; else echo no; fi yes

5.

Вы должны помнить, что сценарии оболочки — это не столько язык, сколько набор команд. Инстинктивно вы думаете, что этот «язык» требует, чтобы за if следовало [ или [[ с помощью которых выполняется тестирование. Обе они являются просто командами, которые возвращают состояние выхода, указывающее на успех или неудачу (как и любая другая команда). По этой причине я бы использовал grep, а не команду [.

Читайте также:  Linux info about directory

Теперь, когда вы воспринимаете if как тестирование статуса выхода команды, которая следует за ним (завершена точкой с запятой), почему бы не пересмотреть источник строки, которую вы тестируете?

## вместо этого filetype="$(file -b "$1")" if grep -q "tar archive" 

Опция -q делает так, что grep ничего не выводит поскольку мы только хотим только код возврата

Можно использовать подстановку процесса:

Источник

Оцените статью
Adblock
detector