find & sed (cerca e sostituisci)


27

Sto usando 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 in .java, che contengono entrambi il testo di foo. Mi sto perdendo 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 .

2
È esattamente quello che stai correndo? Cosa succede se si rimuove il -exece tutto dopo? Stampa i nomi dei file Java? (Sono preoccupato che stai usando virgolette intelligenti invece di virgolette ASCII.)
Mikel,

1
In realtà, questo lo risolve, almeno per me. Le virgolette doppie e singole devono essere sostituite rispettivamente da "e '.
Lev Levitsky,

2
Citazioni intelligenti (?)! .. :)
Peter.O

Quello che ho incollato era esattamente quello che stavo correndo. Qualcuno può pubblicare una risposta?
Amir Afghani,

1
La prossima volta si prega di inviare il messaggio di errore che viene visualizzato quando si pone la domanda. Risparmierai tempo per tutti.
Mikel,

Risposte:


34

Prima di tutto, assicurati di utilizzare le normali virgolette ASCII come "e '(codici ASCII 0x22e 0x27, rispettivamente) negli script di shell, perché l'esempio nel tuo post contiene caratteri di virgolette non standard. Se guardi da vicino, sembrano un po 'diversi. Molto probabilmente questo è un errore di copia e incolla da un formato di documento RTF come Word, OOWriter o persino una finestra del browser.

Dato che sei su un Mac, molto probabilmente hai l'implementazione di FreeBSD sed, nel qual 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 sedchiamata per file).

Per l'attuazione di FreeBSD della seddella -ibandiera ha bisogno di un argomento: l'estensione di un file di backup. Ad esempio con -i .bakil comando farebbe il backup file1.txtcome file1.txt.bakprima prima di eseguire la sostituzione nel file originale. Usare un argomento vuoto ''significa non usare un file di backup, che sembra essere quello che vuoi.

La stessa cosa nell'implementazione 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.


Cosa fanno le parentesi graffe?
Zane Hitchcox,

3
@ZaneHitchcox le parentesi graffe sono segnaposto per il nome file abbinato
Stop al danno continuo a Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.