bash 中带有参数的 grep 引号

Quotes in grep in bash with arguments

我有这个脚本可以在当前目录的所有 pdf 中找到一些文本 (hello)

find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep "hello" -iF --with-filename --label="{}" --color' \;

我想使用第一个参数而不是固定字符串。 我用"""\"\""和其他组合替换了"hello",但没有用。

我认为 和单引号内的双引号有问题。

你能帮我解决这个问题吗?

此代码的更安全版本如下所示:

text_to_search_for="hello"
text_to_search_for="$text_to_search_for" find . -name '*.pdf' -exec sh -c '
  for file do
    pdftotext "$file" - | grep "$text_to_search_for" -iF --with-filename --label="$file" --color
  done
' sh {} +

注意:

  • text_to_search_for="$text_to_search_for" 放在同一行的 find 之前 意味着我们仅在持续时间内将变量 text_to_search_for 导出到环境那一个命令。
  • 我们将要搜索的文本作为环境变量传递到 find 的副本中,我们是 运行,这反过来又允许它被 [=15= 的副本继承] find 开始。
  • 我们从未在作为参数传递给sh -c的字符串中使用{},但仅在为该命令生成参数时使用它。出于可移植性和安全性的原因,这绝对是至关重要的; find 的 POSIX 标准不保证 {} 在子字符串而不是完整字符串时有效,更重要的是,将 {} 替换为代码意味着您的文件名正在迭代可用于攻击您的系统。
  • 我们使用 sh {} + 将多个文件名传递给 sh 的每个副本,并使用 for file do 将每个文件名分配给变量 file。 (sh[=27=] 的占位符,因此 find 中的名称分配给 </code> 及以后的名称; <code>[=27=] 用于错误消息,因此无论如果与错误一起打印,占位符应该是有意义的。