使用sed正则递归搜索替换文件内容,测试正则无输出求助
解决sed正则匹配无输出的问题
首先,你的sed命令没输出的核心原因是sed默认使用基础正则表达式(BRE),但你用了扩展正则表达式(ERE)的专属语法——比如非捕获组(?:...)、未转义的?量词,这些在BRE里是不被识别的,直接导致正则完全匹配不到目标内容。
下面分两种方式帮你修正命令,同时适配你要匹配的['DB']['1']['HOST'] = 'localhost'这类字符串:
方式1:启用扩展正则表达式(推荐)
给sed加上-E选项(GNU sed和BSD sed都支持),就能直接使用ERE语法,同时调整正则细节让匹配更准确:
sed -nE '/\[\'HOST\'\][[:space:]]*=[[:space:]]*('\''|")(.+)\1/p' /path/to/file
修正点说明:
- 用
[[:space:]]*替代\s?:[[:space:]]是POSIX标准的空白字符(包含空格、制表符),*匹配0或多个空白,比?(仅匹配0或1个)更适配实际场景(比如代码里可能有多个空格缩进) - 把非捕获组
(?:\'|")改成捕获组('\''|"),再用\1反向引用结束的引号——保证前后引号类型一致(避免匹配到'localhost"这种混合引号的错误内容) -E启用ERE后,分组括号()不需要转义,写法更简洁直观
方式2:适配基础正则表达式(BRE)
如果不想加-E选项,需要把ERE语法转换成BRE支持的格式:
sed -n '/\[\'HOST\'\][[:space:]]*\=[[:space:]]*\('\''\|"\)\(.\+\)\1/p' /path/to/file
修正点说明:
- BRE里,量词
?要写成\?,这里我们用*更实用,所以直接用[[:space:]]*匹配任意空白 - BRE里的分组括号
()需要转义成\(\),或运算符|也要转义成\| - 同样用
\1反向引用引号,保证前后匹配的引号一致
递归搜索替换的完整示例
如果你最终要递归搜索所有文件并替换目标内容(比如把localhost改成db.example.com),可以结合find命令实现:
find /your/target/dir -type f -exec sed -i.bak -E 's/\[\'HOST\'\][[:space:]]*=[[:space:]]*('\''|").+\1/\[\'HOST\'\] = '\''db.example.com'\''/g' {} +
说明:
-i.bak会在修改文件前创建备份(后缀为.bak),如果不需要备份,GNU sed可以写成-i,BSD sed需要写成-i ''s/匹配模式/替换内容/g是sed的替换语法,g表示全局替换(同一行有多个匹配时全部替换)
测试时可以先去掉-i.bak,保留-n和p,先确认能匹配到目标内容再执行替换,避免误改文件。
内容的提问来源于stack exchange,提问作者heppi75
相关产品推荐
相关产品推荐

