正規表現で変数文字列を使用するにはどうすればよいですか
while read line
do
if [[ line =~ *"$key"* ]]; then
echo line
fi
done < "$filename"
$key
は文字列変数であり、$key
の値を持つすべての行を出力したい
そこでいくつかの間違いをしました。修正したスクリプトは次のとおりです。
while read line
do
if [[ "$line" =~ "$key" ]]; then
echo $line
fi
done < "$filename"
単純なgrep
で置き換えることができるようですが:
grep "$key" "$filename"
まず、変数の値を使用するときは常に、$line
を記述する必要があります。
また、read line
は、先頭と末尾の空白を取り除き、シーケンスのバックスラッシュと改行を行の継続として許可することに注意してください。空白を保持するには、IFS= read
を使用します。 \
を特別に扱わないようにするには、read -r
を使用します。もちろん、2つをIFS= read -r
として組み合わせることができます。
正確に何をテストしたいですか?行が正確に$key
であることをテストする場合(IFS= read
を使用しない限り、空白を除く)、==
演算子を使用し、$key
を二重引用符で囲んでください。
if [[ $line == "$key" ]]; then …
行に$key
が含まれていることをテストする場合(たとえば、key
の値がfu*bar
の場合、hellofu*bar
とfu*barqux
は一致しますが、fuubar
とgu*bar
は一致しない場合)、==
演算子を使用して、もう一度$key
をdoubleに挿入してください引用。 ==
演算子の右側は、シェルのワイルドカードパターンです。変数を二重引用符で囲むと、文字どおりに処理されます。
if [[ $line == *"$key"* ]]; then …
$key
をワイルドカードパターンとして扱う場合、$key
がfu*bar
の場合、行はfubar
またはfuqwebar
にできますが、fbar
またはafubar
にはできません。二重引用符は省略します。
if [[ $line == $key ]]; then …
行の一部のみを一致させたい場合は、afubar
などを許可します。
if [[ $line == *$key* ]]; then …
右側に 拡張正規表現 が必要な場合は、正規表現一致演算子=~
を使用します。正規表現は行の一部に一致できます。行全体を一致させる場合は、正規表現の先頭に^
を、末尾に$
を配置します。たとえば、[[ $line == *"$key"* ]]
は[[ $line =~ "$key" ]]
と同等であり、[[ $line == "$key" ]]
は[[ $line =~ ^"$key"$ ]]
と同等です。