我有许多具有不同目录的文本文件。我需要搜索一个特定字符串,并且需要将该字符串替换为特定值 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
当前目录中或当前目录下的所有文件,请使用find
sed
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
。