为什么替换空字符(空格、制表符等)不适用于 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
是前两个位置参数;如果您想要匹配字符串中的第一组和第二组,则必须使用\1
and \2
。