我正在尝试编写一个包含循环的脚本,该循环输入一系列包含同一文件的目录,以将文件中的文本字符串替换为与目录名称匹配的变量。
变量是 $i=3,4,5,文件名是 FILE
我到目前为止所写的:
for i in ./*z
do
cd $i
if
grep -q 'DZ' FILE
then
sed -i 's/DZ/$iZ/g' FILE
fi
cd ..
done
我得到的是 $iZ,而不是 DZ,而没有改变变量。
我怎样才能解决这个问题?
答案1
假设您希望在 GNU 系统上将文件DZ
中所有出现的./fooz/FILE
替换为, ,则可能是:fooZ
grep -lZe DZ -- *z/FILE |
xargs -r0 perl -pi -e '
my $repl = "${1}Z" if $ARGV =~ m{(.*?)z/};
s/DZ/$repl/g' --
答案2
如果您希望扩展变量,则需要"
在 sed 行中使用双引号,而不是单引号。'
否则,$i
仍然没有扩展。另外,由于Z
不是变量的一部分,因此您需要一个分隔符,例如使用语法${i}
。所以,你的脚本应该是
for i in ./*z
do
cd $i
if
grep -q 'DZ' FILE
then
sed -i "s/DZ/${i}Z/g" FILE
fi
cd ..
done