Grep

如何在 zsh 變數上執行 grep?

  • October 2, 2020

我想內聯以下 2 個命令:

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

通過查找foobar輸入來工作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"

但我收到同樣的錯誤。

這是一個程序替換的地方:它是一個像文件一樣的程式碼塊

將大查詢結果通過管道傳輸到 grep 的標準輸入

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"
 )

似乎您想在 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"使用此處文件或此處字元串。所有的printf,printecho都是內置的zsh,所以你不會得到參數列表太長的錯誤,這是execve()系統呼叫的限制,所以只適用於執行的外部命令(比如grep不是內置的zsh)。

引用自:https://unix.stackexchange.com/questions/612568