複数のモードを渡したい、各モードにオプションを適用する方法にはgrep
多くのソリューションがあります。-e
さまざまなモードが配列に保存されますptrn
。配列要素の空白は-e
パターンに個別に渡されないため、誤って解釈される可能性があるかどうか疑問に思います。
可能性は
可能性1
mptrn=$( printf -- ' -e %s' "${ptrn[@]}" )
grep -E "$mptrn" -- "$flnm"
可能性2
for i in "${!ptrn[@]}"; do
ptrn[$i]="-e ${ptrn[$i]}"
done
grep -E "${ptrn[@]}" -- "$flnm"
可能性3
eptrn=()
for i in "${!ptrn[@]}"; do
eptrn+=("-e" "${ptrn[$i]}")
done
grep -E "${eptrn[@]}" -- "$flnm"
どのソリューションでも発生する可能性のある問題は何ですか?
ベストアンサー1
こうしておいてくださいptrn=(" a b" " 333 22 1 ")
。
答え1:
mptrn=$( printf -- ' -e %s' "${ptrn[@]}" )
grep -E "$mptrn" -- "$flnm"
コマンドの完全な出力はに割り当てられmptrn
、配列の要素に空白文字が含まれていると、使用されている形式によってその要素を区別できません。 (先行および末尾のスペース文字を含む)がmptrn
含まれます。-e a b -e 333 22 1
実行すると、引用grep
符付き引数は先行スペースのためパターン引数として解釈されます。これは達成しよ"$mptrn"
うとするのではなく、指定されたファイルから項目を検索します。このタスクと同じタスクを実行するには、次のものを使用できます。IFS
範囲。
[ "${IFS+x}" = x ] && OLD_IFS=$IFS
IFS=$(printf '\x7f')
mptrn=$(printf "-e${IFS}%s${IFS}" "${ptrn[@]}")
# note that we don't use quotes
grep -E $mptrn -- "$flnm"
if [ "${OLD_IFS+x}" = x ]; then IFS=$OLD_IFS; else unset IFS; fi
答え2:
for i in "${!ptrn[@]}"; do
ptrn[$i]="-e ${ptrn[$i]}"
done
grep -E "${ptrn[@]}" -- "$flnm"
この回答は、検索されたパターンに先行するスペースが含まれることを除いて、所望の結果に近い。つまり、生成されたコマンドは次のようになります。
grep -E "-e a b" "-e 333 22 1 " -- file
スペースを削除すると問題が解決しますptrn[$i]=-e${ptrn[$i]}
。
答え3:
eptrn=()
for i in "${!ptrn[@]}"; do
eptrn+=("-e" "${ptrn[$i]}")
done
grep -E "${eptrn[@]}" -- "$flnm"
この答えは正しいです。生成されたgrep
コマンドは次のとおりです。
grep -E -e " a b" -e " 333 22 1 " -- file