grepの複数の-eオプション

grepの複数の-eオプション

複数のモードを渡したい、各モードにオプションを適用する方法には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

おすすめ記事