如何在 bash 函数中使用“sed”执行“find”

如何在 bash 函数中使用“sed”执行“find”

我正在尝试编写一个简单的 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" ...

相关内容