将带空格的字符串传递给 grep bash 函数中的 -exec sh

passing a string with spaces to an -exec sh within a grep bash function

我想使用 bash 函数使用 pdftotext(不是 pdfgrep)递归搜索 pdf 文件中的字符串,并将我选择的字符串传递给它。该字符串必须能够处理特殊字符,至少是空格。作为裸命令行,它在 bash shell 中完美运行,并演示了我想做什么。

find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "Air France"' \; 2>/dev/null

但是如果我将下面的代码放在 bash shell 函数中,我就无法让它工作。

function pdfsearch () { find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color  '' ' \;  2>/dev/null }

我调用为

pdfsearch 'Air France'   and also trying pdfsearch "Air France"

仅提供包含 "Air" 但不包含 "Air France"

的 pdf

我也尝试使用 $@ 和 shopt -s extglob 变体等。感谢您在我出错的地方提供帮助。

''部分应该改为"'""'"(",',"",',"), 如果您的搜索字符串是双引号友好的。

请参阅以下简化示例:

[STEP 101] # cat file.txt
hello
world
hello world
[STEP 102] # foo() { find -name file.txt -exec sh -c 'cat "{}" | grep '' ' \; ; }
[STEP 103] # foo 'hello world'
hello
hello world
[STEP 104] #
[STEP 105] # foo() { find -name file.txt -exec sh -c 'cat "{}" | grep "'""'" ' \; ; }
[STEP 106] # foo 'hello world'
hello world
[STEP 107] #