На протяжении своей карьеры в программировании вы обнаружите, что довольно часто вам нужно извлекать подстроку из другой строки. Строки - одна из самых распространенных структур данных, поэтому они возникают часто. Готов поспорить, вы могли бы рассказать мне, как это сделать на своем любимом языке программирования, но что, если бы вам пришлось делать это в Bash ? В Bash это не так очевидно, как в других языках, поэтому в этой статье мы объясним, как это сделать несколькими способами.
Если у вас есть опыт работы с операционными системами на основе Unix, то вы, вероятно, уже знаете о оболочке Bash. Но если вы этого не сделаете, вот краткое объяснение. По сути, это командная оболочка, которая изначально была написана для проекта GNU как замена оболочке Борна. Многие разработчики используют оболочку Bash в качестве интерфейса для написания кода или взаимодействия с файловой системой своей операционной системы, а также для выполнения других команд. Поэтому всегда полезно знать, как выполнить для него определенную задачу, если вы часто его используете или вам нужно написать сценарий оболочки.
Использование команды вырезания
Получить подстроку из исходной строки с помощью терминала не так уж
сложно благодаря встроенной команде, специально предназначенной для этой
цели. Он хорошо работает как для использования непосредственно в
командной строке, так и для использования в сценарии оболочки (файл
.sh). Я имею в виду команду cut
, которая представляет собой команду
Bash, которая принимает в -cN-M
), а затем выводит полученную
подстроку. Вот один пример формата команды:
$ echo "STRING" | cut -cN-M
Когда вы вставляете переменные (как строку, так и флаги), Bash вернет
вам символы в строке, начиная с индекса N
и заканчивая M
(включая
символы с индексами N
и M
).
Давайте попробуем несколько примеров. В следующем примере мы используем строку abcdefghi и извлекаем из нее подстроки ниже:
$ echo "abcdefghi" | cut -c2-6
bcdef
Когда вы запустите указанную выше команду в терминале, в результате вы получите «bcdef».
Указание индекса символа - не единственный способ извлечь подстроку. Вы
также можете использовать -d
и -f
для извлечения строки, указав
символы для разделения. -d
позволяет указать разделитель для
разделения, а -f
позволяет выбрать, какую подстроку разделения
выбрать. Имейте в виду, что команда cut
не имеет индекса 0, поэтому
первый элемент в списке начинается с 1.
$ echo "STRING" | cut -d'C' -f I
В приведенном выше примере C
- это символ, который нужно разделить, а
I
- это индекс, который нужно выбрать.
Учитывая это, давайте попробуем другой пример. Предположим, вам нужно
извлечь серию цифр из имени каталога. Формат имени каталога может быть
чем-то вроде «birthday-091216-pics». В этом примере есть несколько
символов перед цифрами, которые нам нужны, и пара символов после них.
Между ними также помещены тире, как показано. Мы можем легко решить эту
проблему с помощью cut
используя только что представленный ранее
синтаксис. Вот как:
$ echo "birthday-091216-pics" | cut -d'-' -f 2
091216
Это разбивает строку на массив (["birthday", "091216", "pics"]), а затем рисует элемент из этого массива для возврата (2-й элемент).
Если вместо этого вам нужно использовать это в сценарии оболочки, ваш код может выглядеть примерно так:
STR="birthday-091216-pics"
SUBSTR=$(echo $STR | cut -d'-' -f 2)
echo $SUBSTR
Когда вы запускаете приведенные выше команды, на выходе вы получаете «091216», как и раньше.
Использование синтаксиса подстроки Bash
Другой способ извлечь подстроки в сценарии оболочки - использовать переменную Bash с синтаксисом подстроки. Синтаксис выглядит так:
string=YOUR-STRING
echo ${string:P}
echo ${string:P:L}
Здесь P
- число, указывающее начальный индекс подстроки, а L
- длина
подстроки. Если вы опустите L
то будет возвращена остальная часть
строки, начиная с позиции P
Это отличается от предыдущего с командой cut
где мы задали начальный и
конечный индексы. В этом случае мы должны вместо этого указать
начальный индекс и длину (или вообще не указывать длину).
Этот способ обычно более предпочтителен для сценариев оболочки,
поскольку он синтаксически более компактен и легче читается. Однако он
плохо работает при использовании непосредственно из командной строки, и
в этом случае вы, вероятно, предпочтете cut
.
Заключение
Есть несколько способов получить подстроку в Bash, некоторые из которых
мы обсуждали здесь. Вы можете использовать cut
или синтаксис подстроки
Bash для извлечения строк в соответствии с вашими потребностями. Чтобы
узнать больше о cut
(которая также может использоваться для файлов),
посетите ее страницу в Википедии
здесь .