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 gearman использовать аргументы в качестве stdin?
  • Использование $ в пароле
  • Livesearch с первыми 10 матчами в качестве предварительного просмотра для zsh-history?
  • Подождите несколько процессов, распечатайте код выхода, если какой-либо процесс завершит работу
  • Как проверить, существует ли приложение в $ PATH?
  • Как заставить поиски google / youtube использовать bash?
  • 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

    Почему setxkbmap создает ключ с другими ключами?

    Выполнить команду после панели tmux split

    В чем разница между ULOG и NFLog?

    Файлы и каталоги исчезают из программного обеспечения Raid при сбое питания

    Я пытаюсь скопировать файлы с сервера в мой локальный каталог с помощью rsync.I не хочу копировать файлы, которые были скопированы ранее и удалены

    Как я могу дважды загружать CentOS и Windows 10?

    Измените фреймбуфер устройства для использования слоя наложения

    Вызов bash getopts из функции не срабатывает 2-й раз

    Разрешение отклонено, даже если я в этой группе

    Не удается загрузить Linux Mint или Ubuntu

    Головоломка: передача файлов между двумя серверами (ssh, ftp, http multipart …)

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

    Когда FTP требует FTP через TLS, это FTPS?

    Нарисуйте сегменты из заданных точек

    Debian Sid, AMD RS880 , черный экран при загрузке

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