解释:

解释:

为什么替换空字符(空格、制表符等)不适用于 sed 和 regexp 分组:

sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"

整行确实替换了文件中的字符串:

sudo find "${config_path}" -type f -exec sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

知道如何修复它吗?

谢谢!

EDIT1:现在使用 -r 启用扩展正则表达式,但仍然不替换:

sudo find "${config_path}" -type f -exec sed -ir "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

但仍然不进行替换。

编辑2(工作解决方案):当使用 \( \) 进行分组时,它可以工作:

sudo find "${config_path}" -type f -exec sed -i "s|dir\(\s*\)=\(\s*\)'${site_path_source}'|dir\1=\2'${site_path_target}'|g" {} \;

但我不明白,为什么带有 -r 扩展正则表达式的 EDIT1 解决方案不起作用。

编辑3(工作解决方案2):使用-r启用扩展正则表达式,它现在可以工作:

sudo find "${config_path}" -type f -exec sed -r -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

解释:

  • 使用“sed -ir SUFFIX”是错误的,因为 -i 需要后缀。
  • 使用“sed -r -i SUFFIX”是很好的,因为-r和-i是分开使用的,并且-i后面是后缀。

答案1

命令

sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"

查找包含d i r (零个或多个空格的行) = (零个或多个空格) '等。如果您尝试使用分组,则必须使用\( \)或说sed -r启用扩展正则表达式。

请注意,$1$2是前两个位置参数;如果您想要匹配字符串中的第一组和第二组,则必须使用\1and \2

相关内容