我正在尝试编写一个带有一些变量的bash脚本,然后使用grep对给定的文件搜索进行查找/替换,以获取具有该字符串的文件列表。我认为我遇到的问题是在sed中看到变量我不知道它可能是什么。
if [ "$searchFiles" != "" -a "$oldString" != "" -a "$newString" != "" ]; then
echo -en "Searching for '$searchFiles' and replacing '$oldString' with '$newString'.\n"
for i in `grep $oldString $searchFiles |cut -d: -f1|uniq`; do
sed -i 's/${oldString}/${newString}/g' $i;
done
echo -en "Done.\n"
else
usage
fi
答案 0 :(得分:21)
使用双引号,以便shell可以替换变量。
for i in `grep -l $oldString $searchFiles`; do
sed -i "s/${oldString}/${newString}/g" $i;
done
如果您的搜索或替换字符串包含特殊字符,则需要将其转义:Escape a string for a sed replace pattern
答案 1 :(得分:5)
使用双引号,以便在调用sed之前由shell扩展环境变量:
sed -i "s/${oldString}/${newString}/g" $i;
警惕:如果oldString
或newString
包含斜杠或其他正则表达式特殊字符,它们将被解释为它们的特殊含义,而不是文字字符串。