如何在 zsh 变量上运行 grep?

如何在 zsh 变量上运行 grep?

我想内联以下两个命令:

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

看来您想在 zsh 变量中搜索foo或 ,bar该变量基本上是某个命令的输出。我不确定为什么你要采取额外的方式将搜索字符串通过管道传输到grep,但除非这是绝对必需的,否则你可以这样做

big_query_that_returns_text | grep -E "foo|bar"

big_query_that_returns_text如果您想在多个地方使用 的输出,并因此将其存储在 shell 变量中,您仍然可以使用

var=$(big_query_that_returns_text)

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

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

这里使用printf '%s\n'.其他替代方案是print -r -- "$var"echo -E - "$var"或使用此处文档或此处字符串。所有的printfprintecho都是内置的zsh,所以你不会得到参数列表太长错误是系统调用的限制execve(),因此仅适用于执行的外部命令(例如grep不是内置的zsh)。

相关内容