web-dev-qa-db-ja.com

正規表現での変数の使用

正規表現で変数文字列を使用するにはどうすればよいですか

 while read line
    do
        if [[ line =~ *"$key"* ]]; then
            echo line
        fi
    done < "$filename"

$keyは文字列変数であり、$keyの値を持つすべての行を出力したい

4
user2798694

そこでいくつかの間違いをしました。修正したスクリプトは次のとおりです。

while read line
do
    if [[ "$line" =~ "$key" ]]; then
        echo $line
    fi
done < "$filename"

単純なgrepで置き換えることができるようですが:

grep "$key" "$filename"
8
janos

まず、変数の値を使用するときは常に、$lineを記述する必要があります。

また、read lineは、先頭と末尾の空白を取り除き、シーケンスのバックスラッシュと改行を行の継続として許可することに注意してください。空白を保持するには、IFS= readを使用します。 \を特別に扱わないようにするには、read -rを使用します。もちろん、2つをIFS= read -rとして組み合わせることができます。

正確に何をテストしたいですか?行が正確に$keyであることをテストする場合(IFS= readを使用しない限り、空白を除く)、==演算子を使用し、$keyを二重引用符で囲んでください。

if [[ $line == "$key" ]]; then …

行に$keyが含まれていることをテストする場合(たとえば、keyの値がfu*barの場合、hellofu*barfu*barquxは一致しますが、fuubargu*barは一致しない場合)、==演算子を使用して、もう一度$keyをdoubleに挿入してください引用。 ==演算子の右側は、シェルのワイルドカードパターンです。変数を二重引用符で囲むと、文字どおりに処理されます。

if [[ $line == *"$key"* ]]; then …

$keyをワイルドカードパターンとして扱う場合、$keyfu*barの場合、行はfubarまたはfuqwebarにできますが、fbarまたはafubarにはできません。二重引用符は省略します。

if [[ $line == $key ]]; then …

行の一部のみを一致させたい場合は、afubarなどを許可します。

if [[ $line == *$key* ]]; then …

右側に 拡張正規表現 が必要な場合は、正規表現一致演算子=~を使用します。正規表現は行の一部に一致できます。行全体を一致させる場合は、正規表現の先頭に^を、末尾に$を配置します。たとえば、[[ $line == *"$key"* ]][[ $line =~ "$key" ]]と同等であり、[[ $line == "$key" ]][[ $line =~ ^"$key"$ ]]と同等です。