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"
但我收到同樣的錯誤。
這是一個程序替換的地方:它是一個像文件一樣的程式碼塊
將大查詢結果通過管道傳輸到 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
,echo
都是內置的zsh
,所以你不會得到參數列表太長的錯誤,這是execve()
系統呼叫的限制,所以只適用於執行的外部命令(比如grep
不是內置的zsh
)。