批量修改patch_data.conf时sed命令报错的解决方法咨询
这个错误我太熟悉了!问题出在两个关键地方:sed的分隔符冲突,还有变量没有正确展开。
问题根源拆解
- 分隔符冲突:你用了sed默认的
/作为替换命令的分隔符,但你的stringreplace和stringnew里全是路径中的/。sed会把第一个/当成匹配部分的结束标记,后面的/就会被误判为无效的命令选项,直接触发unknown option to 's'错误。 - 变量未展开:你用单引号包裹了sed的表达式,bash在单引号环境下不会解析变量,所以sed其实是在尝试匹配字面量
$stringreplace,而不是你定义的那个实际字符串——这不仅找不到目标内容,还会和分隔符问题叠加报错。
修复后的脚本
只需要改两处就能解决问题,完整脚本如下:
#!/bin/bash Directory=~/MIUI_developer stringreplace="include \"/home/miui-tool/Patches_jbart/MIUI_9/patches/Weather/Weather.ptch\";" stringnew="#include \"/home/miui-tool/Patches_jbart/MIUI_9/patches/Weather/Weather.ptch\";" sudo find "$Directory" -type f -name "patch_data.conf" -exec sed -i "s#$stringreplace#$stringnew#g" {} \;
修复细节说明
- 更换分隔符:把sed替换命令的分隔符从
/换成了#,这样路径里的/就不会被误判成分隔符了。如果你的字符串里碰巧包含#,可以换成@或|这类不会出现在内容里的字符。 - 用双引号包裹表达式:让bash先把
$stringreplace和$stringnew替换成实际的字符串,再传给sed执行。 - 给路径变量加双引号:给
$Directory套上双引号,万一以后路径里出现空格也不会出问题,算是个好习惯。
内容的提问来源于stack exchange,提问作者ale8530
相关产品推荐
相关产品推荐

