Поиск по сайту:
Споры бушуют вокруг того, что такое рL/1 - двугорбый или одногорбый верблюд. (Алан.Дж.Перлис)

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

15.07.2023
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:] Символьный класс соответствует всем шестнадцатеричным цифрам.
Читать  Как проверить, является ли ваша система Linux 32-битной или 64-битной

 

Обязательно заключите желаемое имя символьного класса в квадратные скобки с двоеточием, чтобы использовать этот символьный класс в скрипте 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

 

Читать  Как запустить одновременно несколько команд в Linux

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

  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 более эффективными и мощными.

Читать  Как использовать команду taskset в Linux

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

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


Рекомендуемое
Амбиции AMD в отношении ноутбуков премиум-класса на 2023 год вращаются…

Спасибо!

Теперь редакторы в курсе.