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

使用find/sed替换文本文件字符串仅部分匹配生效问题求助

替换{not STRING }为(not STRING )的命令问题

需求

把代码中的:

{not STRING }

替换成:

(not STRING )

执行的命令及问题

执行了以下命令:

find . -maxdepth 1 -type f -exec sed -i -E 's/{not\s([^\s}]+)\s}/(not \1 )/g' {} ;

但该命令只处理了部分匹配项,用相同模式跑grep时,还能找到更多包含目标格式的内容,重复执行命令也没用。

问题原因

原来的正则表达式有两个限制:

  • \s只匹配单个空格,如果{not和STRING之间、STRING和}之间是多个空格,就匹配不到
  • [^\s}]+只能匹配不含空格和}的字符串,如果STRING本身带空格,直接匹配失败

修正后的命令

方案一(适配多空格+带空格的STRING)

find . -maxdepth 1 -type f -exec sed -i -E 's/{not\s+([^}]+)\s}/(not \1 )/g' {} +

方案二(更严谨,适配}前无空格的情况)

find . -maxdepth 1 -type f -exec sed -i -E 's/{not\s+([^}]*)\s*}/(not \1 )/g' {} +

关键调整说明

  • \s+:匹配1个或多个空白字符(空格、制表符都算),替代原来的单个空格匹配
  • [^}]*:匹配任意数量的非}字符,不管STRING里有没有空格都能覆盖
  • \s*:匹配0个或多个空白字符,处理}前可能没有空格的情况
  • 把命令末尾的;换成+:让find一次性把所有符合条件的文件传给sed,执行效率更高

验证匹配项

用下面的grep命令可以找出所有待替换的内容,确认替换是否彻底:

grep -r "{not[^}]*}" . -maxdepth 1

内容的提问来源于stack exchange,提问作者Allan Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:09:25