递归替换目录文件中<foo/...>为"foo/..."的sed命令问题
解决递归替换include路径的问题
问题分析
你原来的命令里,sed替换时直接写了"foo\/.*",这会把匹配到的内容直接替换成字面字符串"foo/.*",而不是保留实际匹配的路径部分。要解决这个问题,需要用正则捕获组来提取并复用匹配到的路径内容。
正确命令
GNU sed(Linux系统默认)
grep -rl "<foo/.*>" ./ | xargs sed -i 's/<foo\/\(.*\)>/"foo\/\1"/g'
BSD sed(macOS系统默认)
macOS的sed语法略有不同,需要给-i加空参数表示不生成备份文件,捕获组写法一致:
grep -rl "<foo/.*>" ./ | xargs sed -i '' 's/<foo\/\(.*\)>/"foo\/\1"/g'
命令解释
grep -rl "<foo/.*>" ./:递归查找当前目录下所有包含<foo/...>格式内容的文件xargs sed ...:把找到的文件列表传给sed批量处理sed替换规则's/<foo\/\(.*\)>/"foo\/\1"/g':<foo\/\(.*\)>:用\(.*\)捕获<foo/和>之间的所有多级路径内容"foo\/\1":用\1引用刚才捕获的路径内容,再用双引号包裹,实现从<foo/xxx.h>到"foo/xxx.h"的精准替换
验证效果
文件./dir1/a.cc中的#include <foo/bar.h>会被替换为#include "foo/bar.h";./dir1/dir2/b.h中的#include <foo/bar/baz.h>会被替换为#include "foo/bar/baz.h",完全符合需求。
内容的提问来源于stack exchange,提问作者Matt Stokes
相关产品推荐
相关产品推荐

