2010-12-14 121 views
15

J'essaie de trouver et de remplacer une chaîne dans un dossier de fichiers.Rechercher et remplacer une chaîne dans un fichier

Quelqu'un pourrait-il m'aider?

Mon script est la suivante:

#!/bin/bash 
OLD="This is a" 
NEW="I am a" 
DPATH="/home/user/test/*.txt" 
BPATH="/home/user/test/backup/foo" 
[ ! -d $BPATH ] && mkdir -p $BPATH || : 
for f in $DPATH 
do 
    if [ -f $f -a -r $f ]; then 
    /bin/cp -f $f $BPATH 
    sed "s/$OLD/$NEW/g" "$f" 
    else 
    echo "Error: Cannot read $f" 
    fi 
done 

Maintenant, cela semble trouver la chaîne « Ceci est un » et remplace par « Je suis un », mais cela ne imprime à l'écran.

Je dois le remplacer dans les fichiers eux-mêmes.

Merci

Répondre

26

Utilisez l'option -i de sed pour effectuer les changements en place:

sed -i "s/$OLD/$NEW/g" "$f" 
    ^^ 
+0

A travaillé super! Je savais que j'avais raté quelque chose. Merci – terrid25

+0

Ok, y at-il un moyen facile de modifier mon script shell, de sorte qu'il va vérifier dans les sous-dossiers?/home/utilisateur/test/xyz? – terrid25

+0

#! Bin/bash OLD = "Ceci est un" NEW = "Je suis un" BPATH = "/ home/user/backup/foo" trouver. -name '* .shtml' -type f | while read nom faire /bin/cp -f nom $ $ Bpath sed -i "s/$ VIEUX/$ NOUVEAU/g" $ filename fait – terrid25

2

La sortie va à l'écran (stdout) en raison des éléments suivants:

sed "s/$OLD/$NEW/g" "$f" 

Essayez de rediriger vers un fichier (les redirections à un nouveau fichier et puis renomme pour écraser l'original fichier):

sed "s/$OLD/$NEW/g" "$f" > "$f.new" && mv "$f.new" "$f" 
+0

Cela crée un fichier .text.new et le fichier d'origine, example.txt i s écrasé et est vide. Des idées pourquoi? – terrid25

+0

@ user390426: Cela peut être dû au fait que aix n'a pas cité les variables '" $ f.new "'(deux endroits) et' "$ f" '. De plus, le 'mv' ne devrait pas être inconditionnel. Au lieu de cela, il devrait être 'sed ... && mv ...'. –

+0

@Dennis Merci pour les suggestions. J'ai modifié le post. – NPE

0

c'est un extrait que je l'utilise, il supprime toutes les choses entre APA et BEPA (sur plusieurs lignes, y compris la suppression APA, BEPA) i n tous les fichiers ci-dessous le répertoire courant, exclure le répertoire .svn

find . \! -path '*.svn*' -type f -exec sed -i -n '1h;1!H;${;g;s/APA[ \t\r\n]*BEPA//g;p}' {} \; 
0

Check this out

http://cs.boisestate.edu/~amit/teaching/handouts/cs-unix/node130.html

########################################################## 
\#!/bin/sh 

\# sed/changeword 

prog=`basename $0` 

case $# in 
0|1) echo 'Usage:' $prog '<old string> <new string>'; exit 1;; 
esac 

old=$1 
new=$2 
for f in * 
do 
     if test "$f" != "$prog" 

     then 
      if test -f "$f" 
      then 
       sed "s/$old/$new/g" $f > $f.new 
       mv $f $f.orig 
       mv $f.new $f 
       echo $f done 
      fi 
     fi 
done 

##############################################################