사용
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를 사용하여 일치하는 문자열을 가져오는 옵션이 있으므로 문자열이 일치하지 않는 경우 문자열에 어떤 잘못된 문자가 있는지 가져오는 옵션이 있습니까?
답변1
기본 제공 옵션이 표시되지 않으므로 다음과 같은 아이디어가 있습니다.
#!/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
.
답변2
정규식을 무효화하여 찾을 수 있습니다첫 번째잘못된 문자
현재 정규 표현식
$ 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 ' '
답변3
cls='],_[:alnum:]!^`@{}=().;/~|[-'
while getopts : na "-$str"
do case $OPTARG in ([!$cls])
printf %s\\n "$OPTARG"
esac
done
쉘의 getopts
옵션 파서는 문자열을 문자별로 반복적으로 제거하고 가장 최근에 제거된 문자를 쉘 변수에 할당하는 방식으로 작동합니다. 그래서 로프를 분해하고 싶다면 getopts
매우 편리합니다. 그런 다음 현재 반복의 기능을 테스트하기만 하면 됩니다.유효성. 일치하면 유지하고, 일치 !
하지 않으면 printf
유지합니다.
답변4
그러면 일치하는 문자가 캡처됩니다.
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}"