You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在find的-exec grep中搜索含空大括号的指定字符串

解决find + grep搜索含{}字符串的问题

核心问题原因

find的-exec参数里,{}是特殊占位符,会被替换为找到的文件名。当你在grep的搜索字符串里直接写{}时,find会先把它替换成当前文件名,导致grep实际搜索的内容不是你想要的"submodules": {}。

可行方案

方案1:单引号嵌套拼接(bash/zsh通用)

把grep的搜索字符串拆分成单引号片段,让中间的{}脱离find的解析范围:

find . -type f -name "*.json" -exec grep -FHm 1 '"submodules": '\''{}'\'' {} \;

解释:'\''是shell的单引号拼接技巧——先关闭外层单引号,用转义单引号表示实际的单引号,再重新打开外层单引号,这样{}会被当作普通字符串传递给grep。

方案2:双引号包裹+反斜杠转义

用双引号包裹整个搜索串,同时对{}加反斜杠转义,阻止find识别它为占位符:

find . -type f -name "*.json" -exec grep -FHm 1 "\"submodules\": \{\}" {} \;

注意:这种方式在bash下稳定,部分其他shell可能需要额外调整。

方案3:提前定义变量(最直观)

把目标搜索字符串赋值给变量,再在-exec中调用变量,彻底避免find接触到原始的{}:

SEARCH_STR='"submodules": {}'
find . -type f -name "*.json" -exec grep -FHm 1 "$SEARCH_STR" {} \;

这种方式逻辑清晰,不容易出错,优先推荐。

方案4:改用xargs替代-exec

绕开find的-exec占位符限制,用管道+xargs传递文件列表:

find . -type f -name "*.json" | xargs grep -FHm 1 '"submodules": {}'

如果文件名包含空格或特殊字符,加上-print0和-0参数适配:

find . -type f -name "*.json" -print0 | xargs -0 grep -FHm 1 '"submodules": {}'

验证效果

以上方案都能让grep准确搜索"submodules": {}字符串,不会被find替换{}为文件名,可根据自己的shell环境选择合适的方式。

内容的提问来源于stack exchange,提问作者Johan Bezem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:10:07