2010-12-14 16 views
15

Sto cercando di trovare e sostituire una stringa in una cartella di file.Trova e sostituisci stringa in un file

Qualcuno potrebbe aiutarmi?

Il mio script è il seguente:

#!/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 

Ora, questo sembra trovare la stringa 'Si tratta di un' e sostituisce con 'Sono un', ma questo solo stampe a schermo.

Ho bisogno di sostituirlo nei file stessi.

Grazie

risposta

26

Utilizzare l'opzione -i di sed per apportare le modifiche in atto:

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

Ha funzionato alla grande! Sapevo che mi ero perso qualcosa. Grazie – terrid25

+0

Ok, c'è un modo semplice per modificare lo script della mia shell, in modo che controlli le sottocartelle?/home/utente/test/xyz? – terrid25

+0

#! Bin/bash OLD = "Questo è un" NEW = "I am a" BPATH = "/ home/utente/backup/foo" trovare. -name '* .shtml' -type f | mentre leggere il nome del file fare /bin/cp -f $ nomefile $ Bpath sed -i "s/$ OLD/$ NEW/g" $ nomefile fatto – terrid25

2

L'uscita passa a schermo (stdout) per i seguenti motivi:

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

Prova reindirizzamento a un file (le seguenti redirect ad un nuovo file e poi rinomina per sovrascrivere l'originale file):

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

Questo crea un file .text.new e il file originale, example.txt i s sovrascritto ed è vuoto. Qualche idea, perché? – terrid25

+0

@ user390426: Potrebbe essere perché aix non ha citato le variabili '" $ f.new "'(due posti) e' "$ f" '. Inoltre, il 'mv' non dovrebbe essere incondizionato. Invece, dovrebbe essere "sed ... && mv ...". –

+0

@Dennis Grazie per i suggerimenti. Ho modificato il post. – NPE

0

questo è un frammento che uso, rimuove tutta roba tra APA e BEPA (su più linee, tra cui la rimozione di APA, BEPA) i n tutti i file sotto directory corrente, escludere la directory .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 

############################################################## 
Problemi correlati