|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
Help nel sostituire una parola con un'altra, dentro un file
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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
-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, Codice:
find / -name *.avs > tempfile for line in $tempfile do cat line | sed 's/..... ecc... done |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
Quote:
Codice:
find / -name *.avs > tempfile for line in $tempfile do cat 2 | sed 's/ AVCSource > directshowsource > done |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
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: Codice:
#!/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 Dovrebbe andare, non l'ho provato, magari fai una prova prima restringendo la ricerca di find a una cartella... |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6661
|
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 ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
Quote:
|
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
Quote:
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 Ultima modifica di Robertus : 12-05-2010 alle 12:48. |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Quote:
Hai fatto un prova? tipo così: (fai un file prova.txt con all'interno la stringa "testo" e inseriscilo nella dir root) Codice:
#!/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 Ti da degli errori? |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6661
|
Quote:
![]() L'hai provato, almeno?
__________________
![]() |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
si provato, ho modificato poco sopra con edit1 e 2, credo ti siano sfuggiti :P
Quote:
"formato del parametro non corretto" |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
![]() ![]() ![]() 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. |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
Quote:
|
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6661
|
Quote:
![]() 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 ![]() Quanti sono questi file avs?
__________________
![]() |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6661
|
Quote:
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...
__________________
![]() |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 444
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Apr 2004
Città: Livorno
Messaggi: 6661
|
Allora taglia la testa al toro e ritorna alla tua idea iniziale dello script: PowerShell.
Ma qui non posso aiutarti, sorry ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Mar 2001
Città: PV Milano Nord
Messaggi: 3851
|
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
__________________
"W la foca, che dio la benedoca"
poteva risolvere tutto la sinistra negli anni in cui ha governato e non l'ha fatto. O sono incapaci o sta bene anche a "loro" cosi. L'una o l'altra inutile scandalizzarsi.[plutus] |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Mar 2001
Città: PV Milano Nord
Messaggi: 3851
|
io ho provato scaricando il sed for windows e questo funziona.
Codice:
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" )
__________________
"W la foca, che dio la benedoca"
poteva risolvere tutto la sinistra negli anni in cui ha governato e non l'ha fatto. O sono incapaci o sta bene anche a "loro" cosi. L'una o l'altra inutile scandalizzarsi.[plutus] |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:40.