我正在尝试编写一个简单的 bash 函数来递归地搜索和替换目录,将一个字符串更改为另一个字符串。这是我所得到的:
function sar () {
from="$1"
shift
to="$1"
shift
if [[ $from == '' || $to == '' ]]
then
echo Usage: sar \<from\> \<to\> \<filename\>
return
fi
while [[ $# -gt 0 ]]
do
filename="$1"
shift
find ./$filename -type f -exec sed -i -e 's/$from/$to/g' {} \;
done
}
例如:
$ sar xxxx yyyy mydir
应该在 ./mydir 中运行 afind
并在它访问的每个文件中将 xxxx 替换为 yyyy。该命令运行时不会产生错误,但不执行任何替换。
与 一起运行set -x
,我明白了
+ find ./mydir -type f -exec sed -i -e 's/$from/$to/g' '{}' ';'
$from
并$to
没有解决,并且出现了一些额外的引用。
在 bash 函数中编写该命令的正确方法是什么(我假设它遵循与 bash 脚本相同的语法规则)?
答案1
当放在单引号内时,变量不会扩展,您需要使用双引号:
... sed -i -e "s/$from/$to/g" ...