2013-06-30 14 views
22

Ciao Sto usando Groovy 2.1.5 e devo scrivere un codice che mostrano le Contens/file di una directory con un determinato percorso, allora si esegue un backup di il file e sostituire una parola/stringa dal file. qui è il codice che ho usato per cercare di sostituire una parola nel file selezionatocome sostituire una stringa/parola in un file di testo in Groovy

String contents = new File('/geretd/resume.txt').getText('UTF-8') 
contents = contents.replaceAll('visa', 'viva') 

anche qui è il mio codice completo se qualcuno vorrebbe modificarlo in modo più efficiente, io apprezzo da quando ho sto imparando.

def dir = new File('/geretd') 
dir.eachFile { 
    if (it.isFile()) { 
     println it.canonicalPath 
    } 
} 

copy = { File src,File dest-> 

    def input = src.newDataInputStream() 
    def output = dest.newDataOutputStream() 

    output << input 

    input.close() 
    output.close() 
} 

//File srcFile = new File(args[0]) 
//File destFile = new File(args[1]) 

File srcFile = new File('/geretd/resume.txt') 
File destFile = new File('/geretd/resumebak.txt') 
copy(srcFile,destFile) 

x = " " 
println x 

def dire = new File('/geretd') 
dir.eachFile { 
    if (it.isFile()) { 
     println it.canonicalPath 
    } 
} 

String contents = new File('/geretd/resume.txt').getText('UTF-8') 
contents = contents.replaceAll('visa', 'viva') 

risposta

8

Vedere this answer dove i modelli vengono sostituiti. Lo stesso principio può essere utilizzato per sostituire le stringhe.

Esempio

def copyAndReplaceText(source, dest, Closure replaceText){ 
    dest.write(replaceText(source.text)) 
} 

def source = new File('source.txt') //Hello World 
def dest = new File('dest.txt') //blank 

copyAndReplaceText(source, dest) { 
    it.replaceAll('World', 'World!!!!!') 
} 

assert 'Hello World' == source.text 
assert 'Hello World!!!!!' == dest.text 
+0

Hi. Sono un po 'nuovo di buon gusto, ci lavoro da due giorni ormai. Se copio incollare la risposta che hai fornito sarà che il lavoro sul mio codice? – geretd

+1

@geretd Sì, ma non vorrei incoraggiarvi a copiare semplicemente la risposta. Fare un tentativo in Groovy Console e vedere come si comporta. Cerca di capire ogni riga. Alla fine della giornata diventerebbe una parte della tua curva di apprendimento se la capisci. – dmahapatro

+0

grazie quello che faccio per imparare come comportarsi è quello di copiare incollare il codice in una console Groovy pulito e cercare di modificarla per lavorare con un file di testo che ho già in una certa directory, per cercare di capire come funziona . ma finora non sono stato in grado di farlo funzionare. come ho detto non ho mai visto questa lingua prima e tutto quello che ho fatto l'ho fatto da solo leggendo e facendo ricerche su google. – geretd

26

In alternativa caricare l'intero file in memoria, si poteva fare di ogni riga, a sua volta

new File('destination.txt').withWriter { w -> 
    new File('source.txt').eachLine { line -> 
    w << line.replaceAll('World', 'World!!!') + System.getProperty("line.separator") 
    } 
} 

Naturalmente questo (e dmahapatro's answer) si basano sulle parole si sta sostituendo non si estende attraverso le linee

+7

Secondo la mia esperienza, questa soluzione divora il separatore di riga. La riga 3 come w << line.replaceAll ('World', 'World !!!') + System.getProperty ("line.separator") funziona meglio. +1 comunque. –

+0

grazie a @OutfastSource, l'ho modificato per non ferire nessun altro. – tedder42

20

Come per quasi tutto Groovy, AntBuilder è il più facile percorso:

ant.replace(file: "myFile", token: "NEEDLE", value: "replacement") 
+0

Questa era la risposta che stavo cercando. Sapevo che c'era una soluzione a una linea per questo, ma non riuscivo a ricordarlo. Ha funzionato perfettamente per me. Grazie. – MxNx

+0

Funziona con regex? –

+0

Guardando la documentazione, direi di no: https://ant.apache.org/manual/Tasks/replace.html –

4

Io uso questo codice per sostituire la porta 8080 a $ {} port.http direttamente in certo file:

def file = new File('deploy/tomcat/conf/server.xml') 
    def newConfig = file.text.replace('8080', '${port.http}') 
    file.text = newConfig 

La prima stringa legge una riga del file nella variabile. La seconda stringa esegue una sostituzione. La terza stringa scrive una variabile in un file.

+0

potrebbe anche aggiornare questo per usare 'replaceAll' – deepelement

0

altra soluzione semplice sarebbe quella dopo la chiusura:

def replace = { File source, String toSearch, String replacement -> 
     source.write(source.text.replaceAll(toSearch, replacement)) 
    } 
Problemi correlati