grepのエスケープ文字[

grepのエスケープ文字[

標準入力から文字列を読み取っていますが、その文字列に一致するユーザーを表示したいと思います。問題は、ユーザーが「[」文字またはそれを含む文字列を入力した場合です。

grep -F行は文字列(^ - -Fを使用した単純な文字)で始まる必要があるため、機能しません。また、getent $userIDではなくユーザー名のみが必要なため、これはお勧めできません。

if [[ "$user" == *"["* ]]; then
    echo -e "Invalid username.\n"
    continue
fi

if ! getent passwd | grep "^$user:"; then
    echo -e "Invalid username.\n"
    continue
fi

これは「[」の回避策です。他の方法はありますか? awkそのタスクを実行する可能性が最も高いですが、それについてはまだわからず、grepに興味があります。

ベストアンサー1

エスケープするか、次のように文字クラスに入れます。

grep '\['

grep '[[]'

grep -e "${user//\[/\\\[}"

${var//c/d}シェル変数の構文=>$varすべての文字cd。今、あなたの場合、この構文は特別なのでc(グロービングを実行する)前にバックスラッシュを付けてエスケープする必要があります。つまり、 。[[\[

今、交換部品に関して私たちに必要なのは、\[次のいずれかです。ただし、パラメーターの代替構文では、\両方が特別です。はい、推測しましたが、両方ともバックスラッシュが必要なので、次の式が生成されます。 [${var//...}\\\["${var//\[/\\\[}"

ファタイ

おすすめ記事