regex – найти недопустимый символ

С помощью

regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]*$' 

в ниже файла сценария я проверяю, есть ли у данной строки какие-либо недопустимые символы или нет.

 str="$1" regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]+$' if [[ $str =~ $regex ]] then echo "matches" echo "Match: ${BASH_REMATCH[0]}" else echo "doesn't match" fi 

Как есть возможность получить строку с сопоставлением с использованием BASH_REMATCH, есть ли какой-либо параметр для получения недопустимого символа в строке, если строка не соответствует?

  • Сценарий Bash для создания скрипта со встроенными значениями
  • Извлечение справочного сообщения из самого скрипта
  • Bash: вывести несколько строк в однострочные команды
  • Проблема при запуске скрипта на хосте после подключения
  • Копирование новейших файлов в существующий каталог
  • Как я могу поддерживать разрывы строк в тексте тела с mailx при отправке вложений?
  • Каковы специальные символы для печати из сценария для перемещения курсора?
  • Как я могу запустить программу с измененным argv с помощью загрузочной ящички busybox?
  • 4 Solutions collect form web for “regex – найти недопустимый символ”

    Я не видел встроенного варианта, поэтому вот одна идея:

     #!/bin/bash str="$1" regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]+$' if [[ $str =~ $regex ]] then echo "matches" echo "Match: ${BASH_REMATCH[0]}" else echo "doesn't match" for (( i = 0; i < ${#str}; i++ )) do c=${str:$i:1} if [[ ! $c =~ $regex ]] then echo Non-matching character at index $i: "$c" fi done fi 

    Он просто перебирает символ $str символом, сравнивая этот символ с $regex .

    Вы можете отменить свое регулярное выражение, чтобы найти первый недопустимый символ

    Ваше текущее регулярное выражение

     $ str="in below script file I am checking if a given string has any invalid characters or not." $ regex='^[]0-9a-zA-Z,!^`@{}=().;/~_|[-]+$' $ [[ $str =~ $regex ]] && echo pass || echo fail fail 

    Не работает. Отмените регулярное выражение: удалите привязки строк и завершающий + квантификатор; отрицать выражение скобки – мы имеем набор недопустимых символов:

     regex='[^]0-9a-zA-Z,!^`@{}=().;/~_|[-]' 

    затем

     $ [[ $str =~ $regex ]] && echo "fail: found '${BASH_REMATCH[0]}'" fail: found ' ' 
     cls='],_[:alnum:]!^`@{}=().;/~|[-' while getopts : na "-$str" do case $OPTARG in ([!$cls]) printf %s\\n "$OPTARG" esac done , cls='],_[:alnum:]!^`@{}=().;/~|[-' while getopts : na "-$str" do case $OPTARG in ([!$cls]) printf %s\\n "$OPTARG" esac done 

    getopts синтаксический анализатор оболочки getopts работает путем итеративного удаления строкового символа по символу и назначения его последнего снятого символа переменной оболочки. И поэтому, если вы хотите разделить строку, getopts может сделать ее довольно удобной. Все, что вам нужно сделать, это проверить текущий символ итерации на действительность . Если это соответствует, оставьте его в покое, но, если ! нет, printf .

    Это поймает символы, которые соответствуют:

     regex=']0-9a-zA-Z,!^`@{}=().;/~_|[-' echo "$str" | grep -oP '^['"$regex"']*' 

    Захват в var и удаление с начала исходной строки:

     head="$(echo "$str" | grep -oP '^['"$regex"']*')" tail="${str#"$head"}" 

    Наконец, получите первый символ, который не удалось:

     failedChar="${tail:0:1}" # higher shells method. failedChar="${tail"${tail#?}"}" # Alternative method. 

    Использование BASH_REMATCH

     str="Testing that this is working." regex=']0-9a-zA-Z,!^`@{}=().;/~_|[-' [[ $str =~ ^[$regex]* ]] head="${BASH_REMATCH[0]}" tail="${str#"$head"}" failedChar="${tail%"${tail#?}"}" echo "fc |$failedChar| at position ${#head}" 
    Interesting Posts

    Что это за данные, которые продолжают появляться после удаления раздела + создания нового раздела?

    ACL для пользователя binddn для PAM?

    Почему новый каталог имеет жесткое количество ссылок 2, прежде чем что-либо добавится к нему?

    Выбор планировщика ввода-вывода на внешних дисках

    Не удалось выполнить рукопожатие Mailx SSL / TLS: Неизвестная ошибка -5938

    Есть ли системный вызов для привязки дескриптора файла непосредственно к другому?

    Преобразование Xcursor в PNG

    Я не могу успешно сгенерировать SSH-туннель внутри контейнера докеров

    Почему дистрибутивы EFI хотят быть одни в многозагрузочной среде?

    Создание приложения bash для OpenWrt

    разные результаты от awk и grep

    Как изменить имя хоста в Fedora 21

    Измените аргументы bash, если задан только один аргумент

    Как rsync файлы с номером имени файла больше, чем число?

    Выполните параллельные команды запуска и дождитесь завершения одной группы команд до начала следующего

    Linux и Unix - лучшая ОС в мире.