zsh変数でgrepを実行する方法は?

zsh変数でgrepを実行する方法は?

次の2つのコマンドをインラインにしたいと思います。

big_query_that_returns_text > in.txt
$ printf '%s\n' "foo" "bar" | grep -f /dev/stdin in.txt

foo検索してbar動作します。in.txt

しかし、私が試したとき

printf '%s\n' "foo" "bar" | grep -f /dev/stdin big_query_that_returns_text

私は受け取った

zsh: argument list too long: grep

私も試しました

var=`big_query_that_returns_text`
printf '%s\n' "foo" "bar" | grep -f /dev/stdin $var
printf '%s\n' "foo" "bar" | grep -f /dev/stdin "$var"

しかし、同じエラーが発生します。

答え1

これは場所ですプロセスの交換:ファイルと同じコードブロックです。

大規模なクエリ結果をgrepのstdinにパイプ

big_query_that_returns_text | grep -f <(printf '%s\n' "foo" "bar")

「foo」と「bar」を生成するコマンドがより複雑な場合は、プロセス置換で任意の改行を使用して読みやすくすることができます。

big_query_that_returns_text \
| grep -f <(
      printf '%s\n' "foo" "bar"
  )

答え2

デフォルトでは、いくつかのコマンドの出力であるfoozsh変数を検索したいようです。barなぜ検索文字列をパイピングする追加の方法を使用するのかわかりませんgrep

big_query_that_returns_text | grep -E "foo|bar"

big_query_that_returns_text複数の場所で出力を使用してシェル変数に保存したい場合は、次のこともできます。

var=$(big_query_that_returns_text)

printf '%s\n' "$var" | grep -E "foo|bar"

... (other operations on $var) ...

ここを使用してくださいprintf '%s\n'。もう1つの選択肢は、ここのドキュメントまたはここの文字列を使用することprint -r -- "$var"です。echo -E - "$var"すべてprintfprintおよびechoが組み込まれているのでzsh取得できません。パラメータリストが長すぎます。エラーはシステムコールの制限なので、実行された外部コマンド(組み込みコマンドなど)execve()にのみ適用されます。grepzsh

関連情報