如何在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
相关产品推荐
相关产品推荐

