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

С помощью

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

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

  • Как избежать повесить вкладку в домашней папке?
  • Поймать неожиданный ввод одиночного символа в bash
  • awk для сопоставления и вырезания полей с чередующимся разделителем
  • Может ли «>» включаться в переменную bash?
  • Добавить строку текста в раздел файла правил
  • История с файлом bash
  •  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, есть ли какой-либо параметр для получения недопустимого символа в строке, если строка не соответствует?

  • $ VAR vs $ {VAR} и цитировать или не указывать
  • bash: как добавить назначенное значение в файл
  • Скрипт для переключения дорожки для ноутбука
  • Терминальный автозаполнение: цикл через предложения
  • Как определить интерпретатор команд из сценария оболочки?
  • Удаление непечатаемых символов с помощью POSIX sed
  • 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}" 
    Linux и Unix - лучшая ОС в мире.