使用
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}"