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=]
用于错误消息,因此无论如果与错误一起打印,占位符应该是有意义的。
我有这个脚本可以在当前目录的所有 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=]
用于错误消息,因此无论如果与错误一起打印,占位符应该是有意义的。