将字符串替换为 $test

将字符串替换为 $test

我有许多具有不同目录的文本文件。我需要搜索一个特定字符串,并且需要将该字符串替换为特定值 as $test。为此,我需要搜索所有目录中的所有文件。

示例:在一个文件中有一个字符串为abcd,我需要将该字符串替换abcd$test。我有一个脚本,可以在所有文件中搜索该字符串并替换该字符串。但我无法用符号替换字符串$。下面的脚本无需$.

command="find \`pwd\` -name \"*\" -type f -exec grep -l \"abcd\" {} \\; 2>/dev/null | xargs  perl -pi.bak1 -w -e 's/abcd/test/g;'"

下面的脚本不适用于$符号。

command="find \`pwd\` -name \"*\" -type f -exec grep -l \"abcd\" {} \\; 2>/dev/null | xargs  perl -pi.bak1 -w -e 's/abcd/\$test/g;'"

如何将字符串替换abcd$test.

答案1

不要尝试将命令放入变量中(参见例如“我们如何运行存储在变量中的命令?”)。

您的命令存在问题,$因为 Perl 在其标量变量上使用它。您不仅必须从 shell 中转义它,还必须从 Perl 中转义它 ( \\\$)。

abcd要使用GNU 或 BSD替换$test当前目录中或当前目录下的所有文件,请使用findsed

find . -type f \
    -exec grep -qF 'abcd' {} ';' \
    -exec sed -i.bak 's/abcd/$test/g' {} ';'

这将查找所有常规文件,测试文件中是否存在该字符串,如果存在,则将其替换为该字符串$test(创建带有后缀的原始文件的备份.bak)。

同样的事情,但是使用 Perl:

find . -type f \
    -exec grep -qF 'abcd' {} ';' \
    -exec perl -pi.bak -e 's/abcd/$test/g' {} ';'

如果删除该-exec grep部分,您将获得所有文件的备份文件,即使它们可能不包含字符串abcd

相关内容