Linux bash разбить строку по разделителю

Работа со строками в bash

Все переменные bash по умолчанию рассматриваются как символьные строки. Поэтому во время работы над сценарием bash придется манипулировать строковыми переменными различными способами.

Строковые переменные в Bash

Важный момент: при работе со строковыми переменными рекомендуется заключать их в двойные кавычки (например, «$var1»). Это связано с тем, что bash может применить разделение слов при расширении переменной, если она не заключена в кавычки. Если строка, хранящаяся в переменной без кавычек, содержит пробелы, строка может быть разделена пробелами и рассматриваться как несколько строк, в зависимости от контекста (например, когда строковая переменная используется в качестве аргумента функции).

Конкатенация двух строк в Bash

В bash нет специального оператора, объединяющего две строки. Чтобы объединить две строковые переменные в bash, необходимо просто поместить одну переменную за другой без какого-либо специального оператора между ними.

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

HOST=http://example.com URI="/list/" ID=128 url1="$HOST$URI$ID" # конкатенировать строковые переменные url2="$HOST$URI$/feed" # объединить строковую переменную со строковым литералом echo "URL1: $url1" echo "URL2: $url2"
URL1: http://example.com/list/128 URL2: http://example.com/list/128/feed

Добавление строки к переменной в Bash

Этот сценарий аналогичен конкатенации строк. Более простой способ — использовать встроенный оператор +=. При использовании со строковыми операндами оператор += добавляет строку к переменной, как показано ниже.

var1="Linux" var2="!" var1+=" the best" # добавить строковый литерал var1+="$var2" # добавить строковую переменную echo $var1

Сравнение двух строк в Bash

Для сравнения используются операторы ‘==’ или ‘!=’ для проверки равенства или неравенства двух строк (или строковых переменных) в bash. Если использовать одинарные скобки в условии, возможно так же использовать ‘=’ в качестве оператора равенства. Но оператор ‘=’ не допускается внутри двойных круглых скобок.

# Все следующие форматы являются допустимыми. if [ "$var1" == "demo" ]; then echo "Это хорошо" fi if [ "$var1" = "demo" ]; then echo "Это хорошо" fi if [ "$var1" != "$var2" ]; then echo "Это плохо" fi if (( "$var1" == "demo" )); then echo "Это нормально" fi

Получить длину строки в Bash

Существует несколько способов подсчета длины строки в bash. Можно использовать wc или awk для получения информации о длине строки, но нет необходимости использовать внешний инструмент для такой простой задачи. В следующем примере показано, как найти длину строки с помощью встроенного механизма bash.

str_var="Это пример строки" len=$ len=$(expr length "$str_var")

Удаление символа переноса строки в Bash

Если необходимо удалить из строки символ новой строки или переноса каретки, можно использовать расширение параметров bash в следующем виде:

Читайте также:  Linux выполнение скрипта каждую минуту

Это выражение подразумевает, что если «строка» содержит символ в конце, хранящийся в «var», то результатом выражения станет «строка» без этого символа. Например:

# входная строка с завершающим символом новой строки input_line=$'Это примерная строка\n' # определите символ конца строки. Для возврата каретки замените его на $'\r' character=$'\n' echo -e "($input_line)" # удалить символ новой строки input_line=$ echo -e "($input_line)"

Обрезание пробелов вначале и конце строки в Bash

Удалить из строки символы пробела в начале или в конце строки возможно с использованием команды sed.

var_str=" Это пример строки " # исходная строка с пробелами echo -e "($var_str)" # обрезать пробелмы вначале строки var_str=$(echo "$var_str" | sed -e "s/^[[:space:]]*//") echo -e "($var_str)" # обрезать пробелы в конце строки var_str=$(echo "$var_str" | sed -e "s/[[:space:]]*$//") echo -e "($var_str)"

Для упрощения аналогичных задач, возможно использовать функцию bash

trim() < local var="$*" # удаляем пробелы var="$">" # удалить прбелы в конце строки var="$">" echo "$var" > my_str=" Это пример строки " echo "($my_str)" my_str=$(trim $my_str) echo "($my_str)"

Удаление префикса, суффикса или любой подстроки из строки в Bash

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

Если подстрока содержит какой-либо специальный символ (например, ‘[‘ и ‘]’ в данном примере), то в sed его необходимо экранировать с помощью ‘\’.

var_str="[DEBUG] Device0 is not a valid input [EOL]" prefix="\[DEBUG\]" suffix="\[EOL\]" substring="valid" echo "$var_str" # удалить префикс из строки var_str=$(echo "$var_str" | sed -e "s/^$prefix//") echo "$var_str" # удалить суффикс из строки var_str=$(echo "$var_str" | sed -e "s/$suffix$//") echo "$var_str" # удалить подстроку из строки var_str=$(echo "$var_str" | sed -e "s/$substring//") echo "$var_str"

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

var_str="[DEBUG] Device0 is not a valid input [EOL]" prefix="[DEBUG]" suffix="[EOL]" # удалите префиксную строку var_str=$ echo "$var_str" # удалить суффиксную строку var_str=$ echo "$var_str"

Проверьте, начинается ли строка с подстроки в Bash

Если необходимо проверить, начинается ли строковая переменная с префикса, существует несколько способов сделать это, как показано ниже.

var1="Этот текст" prefix="Это" case $var1 in $prefix*) echo "1. \"$var1\" начинается с \"$prefix\"" esac if [[ $var1 =~ ^$prefix ]]; then echo "2. \"$var1\" начинается с \"$prefix\"" fi if [[ $var1 == $prefix* ]]; then echo "3. \"$var1\" начинается с \"$prefix\"" fi if [[ $var1 == This* ]]; then echo "4. \"$var1\" начинается с \"This\"" fi

Проверить заканчивается ли строка подстрокой в Bash

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

var1="Этот текст" suffix="текст" case $var1 in *$suffix) echo "1. \"$var1\" заканчивается на \"$suffix\"" esac if [[ $var1 =~ $suffix$ ]]; then echo "2. \"$var1\" заканчивается на \"$suffix\"" fi if [[ $var1 == *$suffix ]]; then echo "3. \"$var1\" заканчивается на \"$suffix\"" fi if [[ $var1 == *text ]]; then echo "4. \"$var1\" заканчивается на \"text\"" fi

Проверка соответствия строки регулярному выражению в Bash

В bash можно проверить, содержит ли строка подстроку, совпадающую с регулярным выражением. Как частный случай, еще проще проверить, содержит ли строка фиксированную подстроку.

pattern="длину \s+4+" # регулярное выражение для подстроки var1="Эти данные имеют длину 1000" var2="Эти данные не действительны" if [[ $var1 =~ $pattern ]]; then echo "$var1: длина найдена" else echo "$var1: длина не найдена" fi if [[ $var2 =~ $pattern ]]; then echo "$var2: длина найдена" else echo "$var2: длина не найдена" fi

Разделить строку в Bash

Для разделения строки в bash используется команда read, которая считывает одну строку строки из stdin и разделяет строку по разделителю. Разделенные элементы затем сохраняются либо в массиве, либо в отдельных переменных, переданных командой read. По умолчанию разделителем являются символы ‘ ‘, ‘\t’, ‘\r’, ‘\n’. Необходимо разделить строку по собственному символу, можно указать разделитель в переменной IFS перед вызовом команды read.

# строки для разделения var1="зеленый оранжевый черный фиолетовый" var2="зеленый:оранжевый:черный:фиолетовый" # разделить строку на один или несколько пробелов и сохранить результат в массиве read -a my_array "; do echo $elem done # разделить строку с помощью пользовательского разделителя IFS=':' read -a my_array2 "; do echo $elem done

Замена строки на другую строку в Bash

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

var1="Это очень плохая строка" substring="плохая" # заменяемая строка replacement="хорошая" # заменяемая строка var2="$" echo $var2

Удаление всего текста после символа в Bash

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

Читайте также:  Посмотреть имя домена linux

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

url="http://example.com:1234" delimeter=":" # удалите весь текст, начиная с разделителя result=$ echo $result

Удаление всего текста перед символом в Bash

Если необходимо удалить все, что предшествует и включает определенный символ. Следующая форма расширения параметров bash позволяет это сделать:

Приведенное выше выражение означает, что если «строка» содержит текст, заканчивающийся на «слово», то результатом этого выражения станет «строка» без (самого длинного) совпадающего шаблона. Самый длинный совпадающий шаблон означает, что если «строка» содержит несколько экземпляров «слова», то совпадающий шаблон должен содержать их все. Например:

# удалите весь текст, предшествующий и включающий символ разделитель url="http://example.com:1234" delimeter=":" result=$ echo $result

В приведенном выше примере исходная строка содержит два два разделителя ‘:’. Поскольку мы используем самый длинный шаблон, совпадающим содержимым является «http://example.com:», а не «http:», и, следовательно, результат («1234») — это то, что остается после удаления совпадающего содержимого.

Похожие записи:

Источник

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

Favorite

Добавить в избранное

Допустим, у вас есть длинная строка с несколькими словами, разделенными запятой или подчеркиванием. Вы хотите разбить эту строку и извлечь отдельные слова.

Вы можете разделить строки в bash, используя разделитель внутренних полей (IFS) и команду чтения, или вы можете использовать команду обрезки. Позвольте нам показать вам, как это сделать на примерах.

Метод 1: Разделить строку с помощью команды чтения в Bash

Вот наш пример сценария для разделения строки с помощью команды read:

#!/bin/bash # # Скрипт для разделения строки на основе разделителя my_string="Ubuntu;Linux Mint;Debian;Arch;Fedora" IFS=';' read -ra my_array " do echo $i done

Часть, которая разбивает строку, находится здесь:

Читайте также:  Linux cannot mount read only

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

IFS в команде read разделяет входные данные в разделителе. Команда read читает необработанный ввод (опция -r), поэтому интерпретирует обратную косую черту буквально, а не обрабатывает их как escape-символ. Опция -a с командой read сохраняет слово read в массиве.

Проще говоря, длинная строка разбивается на несколько слов, разделенных разделителем, и эти слова хранятся в массиве.

Теперь вы можете получить доступ к массиву, чтобы получить любое слово, которое вы хотите, или использовать цикл for в bash, чтобы напечатать все слова одно за другим, как мы делали в приведенном выше сценарии.

Вот вывод вышеприведенного скрипта:

Ubuntu
Linux Mint
Debian
Arch
Fedora

Способ 2: разделить строку с помощью команды trim в Bash

Это пример разделения строки bash с использованием команды trim (tr):

#! / bin / bash # # Скрипт для разделения строки на основе разделителя
my_string="Ubuntu;Linux Mint;Debian;Arch;Fedora" my_array=($(echo $my_string | tr ";" "\n")) #Print the split string for i in "$" do echo $i done

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

Проблема с этим подходом состоит в том, что элемент массива разделен на «пробел». Из-за этого такие элементы, как «Linux Mint», будут рассматриваться как два слова.

Вот вывод вышеприведенного скрипта:

Ubuntu
Linux
Mint
Debian
Arch
Fedora

Вот почему мы предпочитаем первым способом разбивать строку в bash.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

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