PDA

View Full Version : Help nel sostituire una parola con un'altra, dentro un file


Robertus
11-05-2010, 22:37
ciao a tutti

ho un'esigenza che non riesco a soddisfare, nonostante abbia tentato con sed, invano...

io ho diversi file su un hard disk, sparsi in diverse directory, con estensione *avs, ma i nomi dei file sono diversi, cio' che li accomuna è l'estensione.

(avs è un file di testo, puo' anche essere .txt, ma è avs perchè è uno script di avysinth, che serve per l'encoding video.)


il mio problema è poter in un colpo solo, modificare dentro ogni file avs, la parola AVCSource con DirectShowSource, e la parola .dga con .ts


solitamente un file si presenta cosi':

LoadPlugin("C:\Program Files\MeGUI\tools\dgavcindex\DGAVCDecode.dll")
AVCSource("F:\Documenti\Script\test.dga")
#deinterlace
#crop
#resize
#denoise
Lanczos4Resize(1280,720) # Lanczos4 (Sharp)

ripeto, ho provato con sed ma senza successo, non riesco a modificare il file avs direttamente e neppure riesco a modificare nello stesso tempo due parole, sempre prima avcsource e poi .dga

attendo qualche aiuto, penso sia molto semplice per voi.

grazie ancora

Teo@Unix
11-05-2010, 23:04
-Per trovare tutti i file con quella estensione potresti usare find
-L'output sono tante righe quante i file trovati, magari lo redirezioni su un file temporaneo...
-Ogni riga è una path completa, quindi puoi creare un ciclo for su questo file che per ogni riga esegue cat <riga> | sed 's/.... > sostituzioni che devi fare nel file>

Credo vada bene per quello che vuoi fare. Fai un pò di prove, ma dovrebbe essere ok.:)

ora non ho tempo ma dovrebbe venire una cosa del tipo,


find / -name *.avs > tempfile

for line in $tempfile
do
cat line | sed 's/..... ecc...
done

Robertus
11-05-2010, 23:33
-Per trovare tutti i file con quella estensione potresti usare find
-L'output sono tante righe quante i file trovati, magari lo redirezioni su un file temporaneo...
-Ogni riga è una path completa, quindi puoi creare un ciclo for su questo file che per ogni riga esegue cat <riga> | sed 's/.... > sostituzioni che devi fare nel file>

Credo vada bene per quello che vuoi fare. Fai un pò di prove, ma dovrebbe essere ok.:)

ora non ho tempo ma dovrebbe venire una cosa del tipo,


find / -name *.avs > tempfile

for line in $tempfile
do
cat line | sed 's/..... ecc...
done

ho provato ma non ci riesco, magari sbaglio io.

find / -name *.avs > tempfile

for line in $tempfile
do
cat 2 | sed 's/ AVCSource > directshowsource >
done

Teo@Unix
12-05-2010, 08:08
La parte con find è corretta.

E' un pò più complicato dopo, ho fatto io però ti consiglio di studiarti un pò di scripting bash, per queste cose fa risparmiare ore e ore di lavoro ;)

lo script:

#!/bin/sh -
find / -name *.avs > tempfile

exec 3<&0
exec < tempfile
while true
do
read direct || break
cat $direct | sed 's/AVCSource/DirectShowSource/g' | sed 's/.dga/.ts/g' > `eval echo $direct`
cat $direct
echo ""
done
exec 0<&3 3<&-
echo END
rm tempfile

il secondo cat nel ciclo stampa il contenuto del file dopo la sostituzioni, così verifiche che sia tutto ok.

Dovrebbe andare, non l'ho provato, magari fai una prova prima restringendo la ricerca di find a una cartella...

MaxArt
12-05-2010, 09:13
Notepad++ ha gli strumenti che ti servono. Fa ricerca e sostituzione nei file, anche con espressioni regolari.
Tanto per non cercare qualcosa di troppo esotico :)

Robertus
12-05-2010, 11:56
La parte con find è corretta.

E' un pò più complicato dopo, ho fatto io però ti consiglio di studiarti un pò di scripting bash, per queste cose fa risparmiare ore e ore di lavoro ;)

lo script:

#!/bin/sh -
find / -name *.avs > tempfile

exec 3<&0
exec < tempfile
while true
do
read direct || break
cat $direct | sed 's/AVCSource/DirectShowSource/g' | sed 's/.dga/.ts/g' > `eval echo $direct`
cat $direct
echo ""
done
exec 0<&3 3<&-
echo END
rm tempfile

il secondo cat nel ciclo stampa il contenuto del file dopo la sostituzioni, così verifiche che sia tutto ok.

Dovrebbe andare, non l'ho provato, magari fai una prova prima restringendo la ricerca di find a una cartella...

nulla da fare, non mi restituisce lo stesso file modificato, e il file temp è vuoto

Robertus
12-05-2010, 12:26
Notepad++ ha gli strumenti che ti servono. Fa ricerca e sostituzione nei file, anche con espressioni regolari.
Tanto per non cercare qualcosa di troppo esotico :)

scusa ma in che modo notepad++ puo' essere d'aiuto?

perchè non vedo innanzitutto alcuna possibilita' nel poter cercare dei file con una determinata estensione all'interno di una unita'

edit: se uso il find in cartelle, il programma va in crash, eheh e non riesco tra l'altro a mettere due parole da sostituire. sono un po' noob non voletemi male :)

edit2: ho fatto un po di prove, pero' non capisco bene come poter modificare piu' espressioni all'interno dello stesso file, senza quindi dover operare prima per sostituire .dga in .ts e poi avcsource in directshowsource

sarebbe bello se si potesse creare un .bat che faccia in automatico con un click

Teo@Unix
12-05-2010, 12:43
nulla da fare, non mi restituisce lo stesso file modificato, e il file temp è vuoto

se tempfile è vuoto significa che non ha trovato file .avs

Hai fatto un prova?

tipo così: (fai un file prova.txt con all'interno la stringa "testo" e inseriscilo nella dir root)

#!/bin/sh -
find /root -name *.txt > tempfile

exec 3<&0
exec < tempfile
while true
do
read direct || break
cat $direct | sed 's/testo/replaced/g' > `eval echo $direct`
cat $direct
echo ""
done
exec 0<&3 3<&-
echo END
rm tempfile

lo script è corretto l'ho provato a me funziona.
Ti da degli errori?

MaxArt
12-05-2010, 12:54
perchè non vedo innanzitutto alcuna possibilita' nel poter cercare dei file con una determinata estensione all'interno di una unita'Ma come no?!? :rolleyes:
L'hai provato, almeno?

Robertus
12-05-2010, 13:40
Ma come no?!? :rolleyes:
L'hai provato, almeno?

si provato, ho modificato poco sopra con edit1 e 2, credo ti siano sfuggiti :P


se tempfile è vuoto significa che non ha trovato file .avs

Hai fatto un prova?

tipo così: (fai un file prova.txt con all'interno la stringa "testo" e inseriscilo nella dir root)

#!/bin/sh -
find /root -name *.txt > tempfile

exec 3<&0
exec < tempfile
while true
do
read direct || break
cat $direct | sed 's/testo/replaced/g' > `eval echo $direct`
cat $direct
echo ""
done
exec 0<&3 3<&-
echo END
rm tempfile

lo script è corretto l'ho provato a me funziona.
Ti da degli errori?

non mi riconosce il comando find ( sono su win7 )
"formato del parametro non corretto"

Teo@Unix
12-05-2010, 13:48
:doh: :doh: :doh: ...

ero molto convinto che eri su linux.. ecco perchè non va.......
quello script è per linux.
(Potevo anche capirlo però C:\Program Files\MeGUI\tools.......) e va bè ieri sera era tardi....

Con windows non lavoro quasi mai a riga di comando.... purtroppo ora non ho tempo di andarmi a vedere come sarebbe...

cmq il consiglio di MaxArt è buono. Usa NotePad++.
Devi scegliere sostituisci nei file scegliendo la cartella e filtri. Non è complicato.

Robertus
12-05-2010, 14:12
:doh: :doh: :doh: ...

ero molto convinto che eri su linux.. ecco perchè non va.......
quello script è per linux.
(Potevo anche capirlo però C:\Program Files\MeGUI\tools.......) e va bè ieri sera era tardi....

Con windows non lavoro quasi mai a riga di comando.... purtroppo ora non ho tempo di andarmi a vedere come sarebbe...

cmq il consiglio di MaxArt è buono. Usa NotePad++.
Devi scegliere sostituisci nei file scegliendo la cartella e filtri. Non è complicato.

va bene grazie lo stesso, mi affido alla mente di max allora :P

MaxArt
12-05-2010, 15:41
si provato, ho modificato poco sopra con edit1 e 2, credo ti siano sfuggiti :PSì, mi erano sfuggiti :fagiano:

Comunque devi sostituire una parola per volta. Con le espressioni regolari puoi anche trovarne due per volta ma per la sostituzione non si può.
Vai su Cerca/Trova nei file (oppure Ctrl-Shift-F), in Trova ci metti AVCSource, in Sostituisci con ci metti DirectShowSource, in Filtri ci metti *.avs.
Poi rifai lo stesso con .dga, .ts e di nuovo *.avs

Se ti va in crash non so che dirti :boh:
Quanti sono questi file avs?

Robertus
12-05-2010, 18:30
Sì, mi erano sfuggiti :fagiano:

Comunque devi sostituire una parola per volta. Con le espressioni regolari puoi anche trovarne due per volta ma per la sostituzione non si può.
Vai su Cerca/Trova nei file (oppure Ctrl-Shift-F), in Trova ci metti AVCSource, in Sostituisci con ci metti DirectShowSource, in Filtri ci metti *.avs.
Poi rifai lo stesso con .dga, .ts e di nuovo *.avs

Se ti va in crash non so che dirti :boh:
Quanti sono questi file avs?

una 40ina.

andava in crash se prima facevo visualizza tutti, se faccio direttamente sostituisci, non va in crash e fa quello che deve.

pero' mi chiedo se c'è un modo per poter fare un .bat cosi che con un click ogni volta che ho bisogno di fare questa operazione, non devo aprire notepad++ ecc ecc

MaxArt
12-05-2010, 23:02
pero' mi chiedo se c'è un modo per poter fare un .bat cosi che con un click ogni volta che ho bisogno di fare questa operazione, non devo aprire notepad++ ecc eccUhm... richiesta lecita.
Notepad++ è un editor piuttosto sofisticato, può eseguire le macro e se non erro può farlo anche da riga di comando. Prova a dare un'occhiata alla documentazione...

Robertus
21-05-2010, 20:07
Uhm... richiesta lecita.
Notepad++ è un editor piuttosto sofisticato, può eseguire le macro e se non erro può farlo anche da riga di comando. Prova a dare un'occhiata alla documentazione...

ho letto la documentazione e si puo' fare ma non ci sono scritti i comandi che si possono eseguire :(

MaxArt
21-05-2010, 21:47
Allora taglia la testa al toro e ritorna alla tua idea iniziale dello script: PowerShell.
Ma qui non posso aiutarti, sorry :boh:

zuper
22-05-2010, 09:12
nn capisco...ma hai installato il sed per windows?

cosa scrivi esattamente?

hai provato solo su un file?

per cercare i files da dos puoi andare benissimo in c: e scrivere

dir /B /S *.avs

quindi fai un FOR:


for /F %a in ('dir /B /S *.avs') do

e poi continui col sed

zuper
22-05-2010, 11:56
io ho provato scaricando il sed for windows e questo funziona.

cd\
for /F "delims==" %%a in ('dir /B /S *.avs') do (
"C:\Program Files\GnuWin32\bin\sed.exe" -i s/AVCSource/DirectShowSource/g "%%a"
"C:\Program Files\GnuWin32\bin\sed.exe" -i s/[.]dga/.ts/g "%%a"
)