[Risolto] Replace di una stringa in tutti i file di una cartella

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

[Risolto] Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 11:26

Gentilissimi,
Dovrei cambiare una stringa in tutti i file di una cartella. In poche parole devo sostituire tutte le occorrenze di http://central.maven.org/maven2/ ed anche http://repo1.maven.org/maven2/ con https://repo1.maven.org/maven2/.

Nel web dicono di fare così:

Codice: Seleziona tutto

TRY THIS:
find . | xargs grep -s central.maven.org | cut -f1 -d : | xargs sed -i '' -e "s/http:\/\/central/https:\/\/repo1/g"
AND THEN: 
find . | xargs grep -s repo1.maven.org | cut -f1 -d : | xargs sed -i '' -e "s/http:\/\/repo1/https:\/\/repo1/g"
Tuttavia, nel chiamare questi comandi, il terminale mi dice:

Codice: Seleziona tutto

sed: can't read : no such file or directory
Qualcuno protrebbe aiutarmi a sistemare questa cosa per cortesia?

EDIT : a quanto pare il problema stava nel fatto che i comandi proposti QUI sono per MAC e non per Linux. Su Linux il comando sed ha una sintassi leggermente diversa.
Ultima modifica di kew il lunedì 9 marzo 2020, 15:48, modificato 2 volte in totale.

Avatar utente
giulux
Amministratore
Amministratore
Messaggi: 23971
Iscrizione: domenica 10 gennaio 2010, 12:17
Desktop: ubuntu 18.04
Distribuzione: Ubuntu 18.04.3 LTS x86_64
Sesso: Maschile
Località: Roma

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da giulux » lunedì 9 marzo 2020, 11:32

Sposto in programmazione.
Dilemmi non è per problemi tecnici.
Leggete per favore la descrizione delle varie sezioni prima di postare, grazie.
con l'aiuto della comunità le cose si mettono quasi sempre a posto (e non apposto), a parte (e non apparte) qualche caso ...

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3786
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da UbuNuovo » lunedì 9 marzo 2020, 14:08

Ma lo devi eseguire su Mac? Se sì, nel comando sed devi usare -i '', su Linux no!
Io aggiungerei in find la directory da elaborare (NOME_DIR) e cercherei solo i file (-type f):

Codice: Seleziona tutto

find NOME_DIR -type f | xargs grep -s central.maven.org | cut -f1 -d : | xargs sed -i "s/http:\/\/central/https:\/\/repo1/g"
find NOME_DIR -type f | xargs grep -s repo1.maven.org | cut -f1 -d : | xargs sed -i "s/http:\/\/repo1/https:\/\/repo1/g"
Occhio, l'opzione -i fa le sostituzioni direttamente, prova il codice su una copia della directory.
Naturalmente devi sostituire NOME_DIR con il nome della directory contenente i file da elaborare.
Puoi mettere il percorso assoluto o relativo, se esegui il codice dalla directory contenente NOME_DIR, basta inserire solo il nome della directory.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 14:21

UbuNuovo ha scritto:
lunedì 9 marzo 2020, 14:08
Ma lo devi eseguire su Mac? Se sì, nel comando sed devi usare -i '', su Linux no!
Devo eseguire su Linux. Stando a questa guida, devo comunque metterlo -i. E infatti mi verrebbe:

Codice: Seleziona tutto

find . -type f -print0 | xargs -0 sed -i 's|http://central.maven.org/maven2/|https://repo1.maven.org/maven2/|g'
find . -type f -print0 | xargs -0 sed -i 's|http://repo1.maven.org/maven2/|https://repo1.maven.org/maven2/|g'
Ma perché è diverso da quello che hai scritto tu?
Puoi mettere il percorso assoluto o relativo, se esegui il codice dalla directory contenente NOME_DIR, basta inserire solo il nome della directory.
In questo caso starei già dentro la cartella NOME_DIR

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3786
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da UbuNuovo » lunedì 9 marzo 2020, 14:29

Sì, -i ci vuole, ma non serve -i '' -e
Ho usato, pari pari, il codice che avevi postato eccetto le modifiche a find e alla opzione di sed.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 14:40

UbuNuovo ha scritto:
lunedì 9 marzo 2020, 14:29
Sì, -i ci vuole, ma non serve -i '' -e
Ho usato, pari pari, il codice che avevi postato eccetto le modifiche a find e alla opzione di sed.
Quindi mi stai dicendo che " macOS utilizza la versione BSD", ed è per questo che sul mio Kubuntu non funzionava?

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3786
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da UbuNuovo » lunedì 9 marzo 2020, 14:49

S', credo di si, non ho un Mac ma ho visto varie volte quella sintassi.
Comunque anch'io avrei scritto il codice come il tuo ultimo postato, a meno che ci siano tanti file che non necessitano di sostituzioni, in quel caso meglio lasciare grep.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 14:55

Ah. Grazie mille, adesso provo.
UbuNuovo ha scritto:
lunedì 9 marzo 2020, 14:49
Comunque anch'io avrei scritto il codice come il tuo ultimo postato, a meno che ci siano tanti file che non necessitano di sostituzioni, in quel caso meglio lasciare grep.
Se non ti scoccio troppo potrei chiederti perché?

Avatar utente
wilecoyote
Gruppo Documentazione
Gruppo Documentazione
Messaggi: 10110
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu Lubuntu
Distribuzione: 9.04 32bit 14/16/18/20.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da wilecoyote » lunedì 9 marzo 2020, 15:07

) Salve, giusto per completezza, se usi Kubuntu la stessa operazione la puoi svolgere più semplicemente per via grafica usando il programma KFileReplace.

:: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.

Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 15:41

wilecoyote ha scritto:
lunedì 9 marzo 2020, 15:07
) Salve, giusto per completezza, se usi Kubuntu la stessa operazione la puoi svolgere più semplicemente per via grafica usando il programma KFileReplace.

:: Ciao
ah

Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

Re: [Risolto] Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 15:48

Comunque ora non da più errore. Grazie mille!

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3786
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: Replace di una stringa in tutti i file di una cartella

Messaggio da UbuNuovo » lunedì 9 marzo 2020, 16:34

kew ha scritto:
lunedì 9 marzo 2020, 14:55
Ah. Grazie mille, adesso provo.
UbuNuovo ha scritto:
lunedì 9 marzo 2020, 14:49
Comunque anch'io avrei scritto il codice come il tuo ultimo postato, a meno che ci siano tanti file che non necessitano di sostituzioni, in quel caso meglio lasciare grep.
Se non ti scoccio troppo potrei chiederti perché?
Prima non potevo risponderti.
Probabilmente avrei dovuto scrivere "forse con grep..." ; l'ho detto credendo che grep fosse più veloce di sed a filtrare un file, in realtà non lo so, bisognerebbe fare qualche prova con molti file voluminosi, ma oggi non posso. Se ne hai voglia... 8-)

Io avrei fatto uno script così:

Codice: Seleziona tutto

#!/bin/bash

dir=NOME_DIR
while read -d $'\0' f; do
	grep -Eq 'central\.maven\.org|repo1.maven.org' "$f" || continue
	sed -i 's@http://central\.maven\.org/maven2/\|http://repo1\.maven\.org/maven2/@https://repo1.maven.org/maven2/@g' "$f"
done < <(find "$dir" -type f -print0)
Poi se vedi che l'uso di grep non velocizza niente si può eliminare la riga grep -q 'central\.maven\.org' "$f" || continue
Ultima modifica di UbuNuovo il lunedì 9 marzo 2020, 16:50, modificato 2 volte in totale.
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

Re: [Risolto] Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 16:47

ahah ti ringrazio, ma ora non è proprio il caso di mettersi a smanettare. Già sto impazzendo per risolvere questi problemi con software che non funzionano, non voglio crearmene di nuovi!

Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3786
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile
Contatti:

Re: [Risolto] Replace di una stringa in tutti i file di una cartella

Messaggio da UbuNuovo » lunedì 9 marzo 2020, 16:51

Ok, qualche volta, se me lo ricordo provo.
Ho corretto la riga con grep per le due condizioni, ne avevo messa solo una.
Ciaux
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.

Avatar utente
kew
Prode Principiante
Messaggi: 55
Iscrizione: mercoledì 28 ottobre 2015, 22:41
Distribuzione: Kubuntu 19.10
Sesso: Maschile

Re: [Risolto] Replace di una stringa in tutti i file di una cartella

Messaggio da kew » lunedì 9 marzo 2020, 16:59

:birra: ciao!

Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti