SED,使用变量和数组

时间:2010-04-21 16:05:52

标签: bash sed

我要做的是使用变量在目录Server_Upload中的多个文件上运行sed:

AB${count}

对应于我所做的一些变量:

  echo " AB1 = 2010-10-09Three " 
  echo " AB2 = 2009-3-09Foo " 
  echo " AB3 = Bar " 

这些对应于 master.ta 中包含单词的每一行,需要更改Server_Upload中的所有文本文件。

如果你理解我的意思......太棒了,我试图尽我所能地解释它,但如果你仍然生气,我会再给它一次,因为我发现它很难表达我的意思。

cd Server_Upload
for fl in *.UP; do
     mv $fl $fl.old
     done

count=1
saveIFS="$IFS"
IFS=$'\n'
array=($(<master.ta))
IFS="$saveIFS"
for i in "${array[@]}"
do
    sed "s/$i/AB${count}/g" $fl.old > $fl
    (( count++ ))
done

它运行,不会给我任何错误,但它没有做我想要的,所以任何想法?

4 个答案:

答案 0 :(得分:2)

你的循环应如下所示:

while read i
  do
  sed "s/$i/AB${count}/g" $fl.old > $fl
  (( count ++ ))
done < master.ta

我没有理由使用数组或类似的东西。这对你有用吗?

答案 1 :(得分:0)

即使sed行位于$fl循环之外,看起来for命令依赖sed来自第一个for循环内部。如果您使用sed进行就地编辑的系统(-i选项),则可以执行以下操作:

count=1
while read i
  do
  sed -i'.old' -e "s/$i/AB${count}/g" Server_Upload/*.UP
  (( count ++ ))
done < master.ta

(这是整个脚本,其中也包含了Patrick的答案。)这应该替换ABn n master.ta行{{1}}文本的每一个文本{{1}}。在任何* .UP文件中。

答案 2 :(得分:0)

我不清楚你要做什么,但我相信你想要的东西: (另)

do
eval repl=\$AB${count}
...

如果你有一个变量$ AB3和一个变量$ count,$ AB $ {count}是$ AB和$ count的串联(所以如果$ AB为空,它与$ count相同)。您需要使用eval来获取$ AB3的值。

答案 3 :(得分:0)

如果您将第一个done语句从第二个done之后的位置移到第一个{{1}},这会有帮助吗?