2010-10-07 10 views
0

J'ai le sed -e 's/<em\:update.*//g' install.rdf > install.rdf dans un script bash, et cela fonctionne sur la ligne de commande, mais dans le script bash, install.rdf se termine un fichier vide.en utilisant sed pour remplacer le contenu d'un fichier ne fonctionne pas dans bash script

Lorsque j'exécute la ligne de commande sed -e 's/<em\:update.*//g' install.rdf > install.rdf, 2 lignes sont supprimées du fichier.

Une idée pourquoi sed -e 's/<em\:update.*//g' install.rdf > install.rdf ne fonctionne pas dans le script bash?

+0

Que UNIX et la version de 'sed' avez-vous? –

Répondre

6

Essayez ceci:

sed -i -e 's/<em\:update.*//g' install.rdf 

Lorsque vous redirigez la sortie vers un fichier en mode troncature, le fichier est tronqué d'abord, avant qu'il ne soit lu. Ainsi, le résultat est un fichier vide. L'utilisation de sed -i évite cela.

solution Portable (et je l'espère pas trop dangereux):

(set -C && 
sed -e 's/<em\:update.*//g' install.rdf > install.rdf.$$ && 
mv install.rdf.$$ install.rdf) 

:-)

+3

Cependant, '-i' est une extension GNU. –

+1

@Matthew: Merci! Correction de la réponse avec quelque chose d'un peu plus général (quoique non sécurisé si le répertoire est accessible en écriture par des tiers malveillants). –

+2

La variable shell $$ est classiquement utilisée pour les environnements non hostiles évitant les problèmes avec les noms partagés: 'sed ... install.rdf> install.rdf. $$; mv install.rdf. $$ install.rdf'. –

Questions connexes