ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Как освоить сопоставление строк с образцами, используя классы символов Bash

Bash Heredoc

Скрипты Bash можно использовать для многих целей, от автоматизации задач системного администрирования до создания инструментов для анализа данных. Одна из областей, в которой выделяется Bash, – это его способность манипулировать символами и строками. GNU Bash предоставляет несколько классов символов, которые можно использовать в сопоставлении с образцом и регулярных выражениях. В этом посте в блоге мы рассмотрим эти классы символов и узнаем, как использовать их в скрипте Bash, который проверяет и классифицирует символы ASCII в подробной таблице ASCII.

 

Что такое классы символов в Bash?

В Bash классы символов – это шаблоны, представляющие группу символов. Они заключены в квадратные скобки и могут использоваться для сопоставления или проверки определенных типов символов. Например, класс символов [[:digit:]] соответствует любому цифровому символу (0-9) а [[:alpha:]] соответствует любому буквенному символу.

Bash поддерживает несколько встроенных классов символов, которые описаны ниже:

Класс Описание
alnum [:alnum:] Класс символов соответствует всем буквенным и цифровым символам.
alpha [:alpha:] Класс символов соответствует всем буквенным символам.
ascii [:ascii:] Класс character соответствует всем символам ASCII.
blank [:blank:] Класс символов соответствует пробелам и табуляциям.
cntrl [:cntrl:] Класс символов соответствует всем управляющим символам.
digit [:digit:] Класс символов соответствует всем числовым цифрам.
graph [:graph:] Класс символов соответствует всем печатаемым символам, кроме пробела.
lower [:lower:] Класс символов соответствует всем строчным буквенным символам.
print [:print:] Класс символов соответствует всем печатаемым символам.
punct [:punct:] Класс символов соответствует всем знакам препинания.
space [:space:] Класс символов соответствует всем пробельным символам.
upper [:upper:] Класс символов соответствует всем буквенным символам верхнего регистра.
word [:word:] Класс символов соответствует всем буквенно-цифровым символам и символу подчеркивания.
xdigit [:xdigit:] Символьный класс соответствует всем шестнадцатеричным цифрам.

 

Обязательно заключите желаемое имя символьного класса в квадратные скобки с двоеточием, чтобы использовать этот символьный класс в скрипте Bash. Например, для сопоставления всех буквенных символов мы можем использовать класс [:alpha:] следующим образом:

# Использование оператора If
if [[ $char =~ [:alpha:] ]]; then
    # do something
fi
# или с помощью команды ls
ls -ld [[:alpha:]]*

 

Мы также можем использовать отрицание с классами символов. Например, для сопоставления всех неалфавитных символов мы можем использовать символ каретки ^ следующим образом:

# Использование оператора If
if [[ $char =~ [^[:alpha:]] ]]; then
    # do something
fi
# Или с помощью команды ls
ls -ld [^[:alpha:]]*

Пример скрипта для генерации ASCII-таблицы с классом символов

Сценарий, который мы рассмотрим, использует классы символов в Bash для тестирования и классификации символов ASCII. Это делается путем перебора диапазона ASCII от 32 до 127. Затем для каждого символа проверяется, принадлежит ли он к любому из следующих классов символов: alnum, alpha, ascii, blank, cntrl, digit, graph, lower, print, punct, space, upper, word, xdigit.

for ((i=32;i<127;i++)); do
   printf -v char "\x$(printf '%x' "$i" )"
   as_class=()
   for class in alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit; do
     [[ "$char" = @([[:$class:]]) ]] && as_class+=("$class") || as_class+=('')
   done
   printf '%3d | %s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s | %-6s| %-6s | %-6s\n' "$i" "$char" "${as_class[@]}"
done

 

Давайте разберем этот сценарий фрагмента и посмотрим, что он делает:

  1. Цикл for повторяется в диапазоне ASCII от 32 до 127.
  2. Команда printf преобразует код ASCII в соответствующий символ и сохраняет его в переменной char.
  3. Массив as_class в bash инициализируется для последующего сохранения класса символов.
  4. Внутренняя система for loop проверяет, принадлежит ли символ каждому из 14 символьных классов, используя условный оператор Bash с [[ … ]] оператором test и конструкцией массива @().
  5. Если символ принадлежит классу, его имя добавляется в массив as_class.
  6. Последняя команда printf печатает код символа, сам символ и результаты тестов класса символов в форматированной таблице.

 

Этот Bash скрипт является полезным инструментом для тестирования и классификации символов ASCII на основе их свойств. Используя классы символов, скрипт может быстро и легко идентифицировать символы, принадлежащие к определенным категориям, таким как цифры, буквы или знаки препинания. Этот скрипт является отличным примером того, как Bash можно использовать для манипулирования символами и строками, и его можно легко модифицировать в соответствии с конкретными вариантами использования.

Пример вывода:

Пример вывода

 

 

Заключение

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

Exit mobile version