使用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
相关产品推荐
相关产品推荐

