2010-04-21 7 views
0

Ce que je suis en train de faire est de lancer la commande sed sur plusieurs fichiers dans le Server_Upload de répertoire, variables à l'aide:sed, en utilisant des variables et avec un tableau

AB${count} 

correspond à certaines variables je fait qui ressemblent à :

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

Et ceux-ci correspondent à chaque ligne qui contient un mot dans master.ta, qui a besoin de changer dans tous les fichiers texte dans Server_Upload. Si vous comprenez ce que je veux dire ... génial, j'ai essayé de l'expliquer du mieux que je peux, mais si vous êtes encore fâché, je vais essayer de nouveau, car je trouve vraiment difficile de transmettre ce que je veux dire .

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 

Il fonctionne, ne me donne pas d'erreurs, mais il ne fait pas ce que je veux, donc des idées?

+2

la prochaine fois, montrez des exemples de fichiers que vous avez. et à quoi ressemble votre sortie désirée. sans expliquer ce que vous voulez en utilisant des échantillons, il est difficile de dire ce que vous faites réellement même si vous publiez votre code puisque votre code peut être faux. – ghostdog74

Répondre

2

Votre boucle devrait ressembler à ceci:

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

Je ne vois pas de raison d'utiliser un tableau ou quelque chose de similaire. Est-ce que ça marche pour toi?

0

Il semble que votre commande sed dépend de $fl à l'intérieur de la première boucle for, même si la ligne sed est en dehors de la boucle for. Si vous êtes sur un système où sed-t édition en place (l'option -i), vous pouvez faire:

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

(Ceci est le script entier, qui intègre la réponse de Patrick, aussi bien.) Cela devrait remplacer le texte ABn pour chaque occurrence du texte de la ligne n de master.ta dans un fichier * .UP.

0

Il est pas tout à fait clair pour moi ce que vous essayez de faire, mais je crois que vous voulez quelque chose comme: (non testé)

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

Si vous avez une variable AB3 $, et un nombre variable $, $ AB $ {count} est la concaténation de $ AB et $ count (donc si $ AB est vide, c'est la même chose que $ count). Vous devez utiliser eval pour obtenir la valeur de $ AB3.

0

Cela aide-t-il si vous déplacez la première instruction done d'où elle est après la seconde done?

Questions connexes