Sto utilizzando il seguente comando sul mio Mac:

$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \; 

e sembra non avere alcun effetto.

Ho due file nella directory che terminano con .java, entrambi con foo testo al loro interno. Mi manca qualcosa?

EDIT: Risultati dalla richiesta di commenti

[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i "s/foo/bar/g" {} \; sed: 1: "./bar.java": invalid command code . sed: 1: "./foo.java": invalid command code . 

Commenti

  • È esattamente quello che ' re in esecuzione? Cosa succede se rimuovi -exec e tutto ciò che segue? Stampa i nomi dei file Java? (' sono preoccupato che ' stai usando virgolette intelligenti invece di virgolette ASCII.)
  • In realtà, questo risolve il problema, almeno per me. Sia le virgolette doppie che quelle singole dovrebbero essere sostituite rispettivamente di " e '.
  • Sm citazioni darte (?)! .. 🙂
  • Quello che ho incollato era esattamente quello che stavo eseguendo. Qualcuno può pubblicare una risposta?
  • La prossima volta per favore pubblica il messaggio di errore che visualizzi quando fai la domanda. Farà risparmiare tempo a tutti.

Rispondi

Prima di tutto, assicurati di “utilizzare ascii regolari virgolette come " e " (codici ascii 0x22 e 0x27, rispettivamente) negli script di shell, perché lesempio nel tuo post contiene virgolette non standard. Se guardi da vicino, hanno un aspetto leggermente diverso. Molto probabilmente questo è un errore di copia-incolla da un documento di testo RT formato come Word, OOWriter o anche una finestra del browser.

Dato che sei su un Mac, molto probabilmente hai limplementazione di FreeBSD di sed, in cui caso devi scrivere il comando in questo modo:

find . -name "*.java" -exec sed -i "" s/foo/bar/g {} + 

(qui usando + invece di \; per evitare di eseguire una sed invocazione per file).

Nellimplementazione di FreeBSD di sed flag richiede un argomento: lestensione di un file di backup. Ad esempio con -i .bak il comando eseguirà il backup di file1.txt come file1.txt.bak prima di eseguire la sostituzione in il file originale. Usare un argomento vuoto "" significa non usare un file di backup, che sembra essere quello che vuoi.

La stessa cosa in GNU (o NetBSD, OpenBSD , busybox) sarebbe:

find . -name "*.java" -exec sed -i s/foo/bar/g {} + 

Grazie @bahamat e @Mikel e @ pieter-breed per aver migliorato la mia risposta con i tuoi commenti.

Commenti

  • Cosa fanno le parentesi graffe?
  • @ZaneHitchcox le parentesi graffe sono segnaposto per il nome del file corrispondente
  • cosa ' è il + fare alla fine?
  • @Anthony the + alla fine termina lelenco degli argomenti dellopzione -exec. È richiesto dalla sintassi di -exec.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *