2010-04-21 58 views
0

我所试图做的是运行的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 

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

+2

下次显示您获得的文件样本。以及你想要的输出是什么样子。没有解释你想要使用什么样的样本,即使你发布了你的代码,因为你的代码可能是错误的,所以很难说你实际上在做什么。 – ghostdog74 2010-04-21 23:56:37

回答

2

你的循环应该是这样的:

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

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

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 

(这是整个脚本,它采用了帕特里克的答案,也是如此。)这个应该取代对于任何* .UP文件中nmaster.ta的每一次出现的文字ABn

0

这不完全清楚,我是你正在尝试做的,但我相信你想要的东西,如: (未经测试)

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

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

0

如果您将第一个done声明从第二个done之后移到第二个声明,它会有帮助吗?