Скрипты 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:] Класс символов соответствует всем печатаемым символам. | |
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
Давайте разберем этот сценарий фрагмента и посмотрим, что он делает:
- Цикл for повторяется в диапазоне ASCII от 32 до 127.
- Команда printf преобразует код ASCII в соответствующий символ и сохраняет его в переменной char.
- Массив as_class в bash инициализируется для последующего сохранения класса символов.
- Внутренняя система for loop проверяет, принадлежит ли символ каждому из 14 символьных классов, используя условный оператор Bash с [[ … ]] оператором test и конструкцией массива @().
- Если символ принадлежит классу, его имя добавляется в массив as_class.
- Последняя команда printf печатает код символа, сам символ и результаты тестов класса символов в форматированной таблице.
Этот Bash скрипт является полезным инструментом для тестирования и классификации символов ASCII на основе их свойств. Используя классы символов, скрипт может быстро и легко идентифицировать символы, принадлежащие к определенным категориям, таким как цифры, буквы или знаки препинания. Этот скрипт является отличным примером того, как Bash можно использовать для манипулирования символами и строками, и его можно легко модифицировать в соответствии с конкретными вариантами использования.
Пример вывода:
Заключение
В этом посте в блоге мы рассмотрели встроенные в Bash символьные классы и узнали, как использовать их в скрипте Bash. Символьные классы являются мощной функцией Bash и могут использоваться различными способами для сопоставления шаблонов и манипулирования строками. Обладая этими знаниями, вы можете сделать свои скрипты Bash более эффективными и мощными.