RHEL 7.4中递归替换含斜杠路径字符串的sed命令求助
嘿,这个场景我太熟悉了!当你要用sed替换包含斜杠的字符串时,默认的斜杠分隔符肯定会搞出问题——毕竟sed会把第一个斜杠当成替换命令的起始,后面的斜杠会被误判成分隔符。别担心,有两个办法解决,其中一个特别省心!
最推荐:更换sed的分隔符
sed允许你自定义替换命令的分隔符,只要选一个不在你的新旧字符串里的字符就行——比如@、#或者|都可以。这样一来,原字符串里的斜杠完全不用处理,命令清晰又不容易出错。
结合find实现递归替换的完整命令如下:
# 记得把/你的目标目录换成你实际要操作的目录路径 find /你的目标目录 -type f -exec sed -i 's@/eOffice/eofficev6@/eOffice/SAPS/eofficev6@g' {} +
拆解一下这个命令:
find /你的目标目录 -type f:递归遍历目标目录下的所有普通文件(跳过目录、设备文件等)-exec sed ... {} +:把find找到的文件批量传给sed处理,这种方式比{} \;效率更高,减少进程创建次数s@旧字符串@新字符串@g:核心的sed替换命令,用@代替默认的/当分隔符,g表示全局替换(如果一行里出现多次目标字符串,全部替换)
备选方案:转义斜杠(不推荐)
如果你非要坚持用默认的/作为分隔符,那就得把新旧字符串里的每个/都转义成\/,命令会变成这样:
find /你的目标目录 -type f -exec sed -i 's/\/eOffice\/eofficev6/\/eOffice\/SAPS\/eofficev6/g' {} +
你看,这样字符串里全是转义符,写起来麻烦还容易漏转义,除非特殊情况,真的不建议用这种方式。
几个重要提醒
- 先测试再修改:如果你不确定替换效果,可以先去掉
-i参数,让sed把替换后的内容输出到终端,确认没问题再加上-i(-i是直接修改原文件,一定要谨慎!) - 备份文件:如果担心误改,可以用
sed -i.bak代替sed -i,这样每个被修改的文件都会生成一个.bak后缀的备份文件 - 过滤文件类型:如果只需要替换特定后缀的文件(比如
.txt、.conf),可以给find加过滤条件,比如find /你的目标目录 -type f -name "*.conf" -exec ...,避免误改二进制文件
内容的提问来源于stack exchange,提问作者Nishant Chourasia
相关产品推荐
相关产品推荐

