Поиск по сайту:

Как работать со строками в Bash в Linux


Если есть что-то, чем Linux хорошо оснащен, так это утилиты для работы со строками. Но есть целый набор функций, встроенных прямо в оболочку Bash. Вот как это используется.

Манипуляции со строками

Экосистема Linux содержит фантастические инструменты для работы с текстом и строками. К ним относятся awk, grep, sed и cut. Для любых тяжеловесных текстовых споров это должен быть ваш выбор.

Однако иногда бывает удобно использовать встроенные возможности оболочки, особенно когда вы пишете короткий и простой скрипт. Если ваш сценарий будет использоваться совместно с другими людьми и будет выполняться на их компьютерах, использование стандартной функциональности Bash означает, что вам не нужно беспокоиться о наличии или версии каких-либо других утилит.

Если вам нужна мощность специализированных утилит, то обязательно используйте их. Вот для чего они там. Но часто ваш сценарий и Bash могут выполнять свою работу самостоятельно.

Поскольку они встроены в Bash, вы можете использовать их в сценариях или в командной строке. Использование их в окне терминала — это быстрый и удобный способ создания прототипов команд и совершенствования синтаксиса. Это позволяет избежать цикла редактирования, сохранения, запуска и отладки.

Создание и работа со строковыми переменными

Все, что нам нужно, чтобы объявить переменную и присвоить ей строку, — это назвать переменную, использовать знак равенства = и предоставить строку. Если в строке есть пробелы, заключите ее в одинарные или двойные кавычки. Убедитесь, что по обе стороны от знака равенства нет пробелов.

my_string="Hello, How-To Geek World."
echo $my_string

После того, как вы создали переменную, имя этой переменной добавляется в список слов завершения табуляции оболочки. В этом примере при вводе «my_» и нажатии клавиши «Tab» в командной строке вводилось полное имя.

Переменные только для чтения

Существует команда declare, которую мы можем использовать для объявления переменных. В простых случаях он вам особо не нужен, но его использование позволяет использовать некоторые опции команды. Вероятно, чаще всего вы будете использовать параметр -r (только для чтения). Это создает переменную только для чтения, которую нельзя изменить.

declare -r read_only_var="This is an immutable string!"

Если мы попытаемся присвоить ему новое значение, это не удастся.

read_only_var="A new string..."

Запись в окно терминала

Мы можем записать несколько строк в окно терминала, используя echo или printf, чтобы они отображались как одна строка. И мы не ограничены нашими собственными строковыми переменными, мы можем включать переменные среды в наши команды.

user_account="Your user account is:"
echo $user_account $USER

Объединение строк

Оператор плюс-равно += позволяет сложить две строки вместе. Это называется объединением.

user_account="Your user account is:"
user_account+=$USER
echo $user_account

Обратите внимание, что между объединенными строками автоматически не добавляется пробел. Если вам нужен пробел, вам нужно явно поместить его в конец первой строки или в начало второй.

user_account="Your user account is: "
user_account+=$USER
echo $user_account

Чтение пользовательского ввода

Помимо создания строковых переменных, содержимое которых определяется как часть их объявления, мы можем считывать пользовательский ввод в строковую переменную.

Команда read считывает ввод пользователя. Опция -p (запрос) записывает запрос в окно терминала. Ввод пользователя сохраняется в строковой переменной. В этом примере переменная называется user_file.

read -p "Open which file? " user_file
echo $user_file

Если вы не предоставите строковую переменную для захвата ввода, она все равно будет работать. Пользовательский ввод будет сохранен в переменной с именем REPLY.

read -p "Open which file? "
echo $REPLY

Обычно удобнее предоставить свою собственную переменную и дать ей осмысленное имя.

Манипулирование строками

Теперь, когда у нас есть строки, определенные во время создания, прочитанные из пользовательского ввода или созданные путем объединения строк, мы можем начать с ними что-то делать.

Нахождение длины строки

Если важно или полезно знать длину строки, мы можем получить ее, поставив перед именем переменной символ решетки «#».

my_string="There are 39 characters in this string."
echo ${#my_string}

Извлечение подстрок по смещениям символов

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

Начальная точка и длина следуют за именем переменной с двоеточием «:» между ними. Обратите внимание, что символы в строковой переменной нумеруются, начиная с ноля.

long_string="Frankenstein or the Modern Prometheus"
substring=${long_string:0:12}
echo $substring
echo ${long_string:27}

Другой вариант позволяет вам отбросить несколько букв в конце строки. По сути, это позволяет вам установить начальную точку и использовать отрицательное число в качестве длины. Подстрока будет содержать символы от начальной точки до конца строки минус количество символов, указанное вами в отрицательном числе.

my_string="alphabetical"
echo ${my_string:5:-4}

Во всех случаях исходная строковая переменная остается нетронутой. «Извлеченная» подстрока фактически не удаляется из содержимого переменной.

Извлечение подстрок по разделителю

Недостаток использования смещений символов заключается в том, что вам нужно заранее знать, где в строке расположены подстроки, которые вы хотите извлечь.

Если ваша строка разделена повторяющимся символом, вы можете извлекать подстроки, не зная, где они находятся в строке и какова их длина.

Чтобы выполнить поиск с начала строки, после имени переменной используйте знаки двойного процента, %%, символ-разделитель и звездочку, *. Слова в этой строке разделены пробелами.

long_string="first second third fourth fifth"
echo ${long_string%%' '*}

Это возвращает первую подстроку с начала строки, которая не содержит символ-разделитель. Это называется опцией короткой подстроки.

Параметр long substring возвращает начальную часть строки до последней разделенной подстроки. Другими словами, он опускает последнюю подстроку с разделителями. Синтаксически единственное отличие состоит в том, что в команде используется один знак процента «%».

long_string="first second third fourth fifth"
echo ${long_string%' '*}

Как и следовало ожидать, таким же образом можно искать с конца строки. Вместо знака процента используйте решетку «#» и переместите разделитель так, чтобы он шел после звездочки «*» в команде .

long_string="this.long.string.of.words.is.delimited.by.periods"
echo ${long_string##*.}

Это опция короткой подстроки, она обрезает первую найденную подстроку в конце строки, не содержащей разделителя.

long_string="this.long.string.of.words.is.delimited.by.periods"
echo ${long_string#*.}

Опция длинной подстроки возвращает заднюю часть строки до первого разделителя с начала строки. Другими словами, он опускает первую подстроку с разделителями.

Замена подстроки

Замена подстрок на другие подстроки очень проста. Формат — это имя строки, подстрока, которая будет заменена, и подстрока, которая будет вставлена, разделенные символами косой черты «/».

string="blue pig giggles"
echo ${string/pig/goat}

Чтобы ограничить поиск концом строки, поставьте перед строкой поиска знак процента «% ».

string="blue pig giggles"
echo ${string/%giggles/chuckles}

Чтобы ограничить поиск началом строки, поставьте перед строкой поиска решетку #.

string="blue pig giggles"
echo ${string/#blue/yellow}

Строка — гибкая вещь

Если строка не совсем такая, как вам хотелось бы или нужна, эти инструменты помогут вам переформатировать ее так, чтобы она соответствовала вашим потребностям. Для сложных преобразований используйте специальные утилиты, а для незначительных настроек используйте встроенные средства оболочки и избегайте накладных расходов на загрузку и запуск внешнего инструмента.