2012-08-13 9 views

risposta

23

la versione di OS X di sed sono supportate -i, ma richiede un argomento indicare cosa estensione del file da utilizzare per il file di backup (o "" per alcun backup). A proposito, vuoi grep -l per ottenere solo i nomi dei file.

grep -l '/static' dir/* | xargs sed -i "" 's/\/static//g' 
+0

Ha funzionato! Non stavo dando un'estensione per il file di backup. Trowing that in there ha funzionato. Questo è sicuramente più facile da ricordare che passare attraverso un ciclo for. Grazie! – davierc

3

Uso perl:

$ perl -pi.bak -e '[email protected]/[email protected]@g' dir/* 
+0

Speravo in una risposta usando grep e sed poiché non conosco una leccata di perl. Grazie per la risposta. – davierc

+0

In questo scenario limitato, Perl è abbastanza simile a 'sed'. Puoi convertire semplici script 'sed' in Perl con lo strumento' s2p'. – tripleee

1

È possibile eseguire questa operazione utilizzando un ciclo :

for file in $(grep -l '/static' dir/*) ; do 
    sed 's/\/static//g' $file > $file.$$ && mv $file.$$ $file 
done 

io uso il suffisso .$$ ($$ è l'ID di processo del shel corrente l) per evitare collisioni con nomi di file esistenti e && anziché ; per evitare di copiare il file di input se il comando sed ha esito negativo per qualche motivo. Ho anche aggiunto -l quindi grep stampa i nomi dei file anziché le linee corrispondenti.

Oppure è possibile installare GNU sed (non so esattamente come farlo su OSX).

+0

Non dovrebbe il comando 'grep' stampare i nomi dei file invece delle righe con le corrispondenze, come' $ (grep --files-with-matches '/ static' dir/*) '? – Birei

+0

@Birei: Giusto (ho copiato il comando grep dalla domanda, avrei dovuto controllare più attentamente). Risposta aggiornata –

+0

Grazie per il suggerimento sull'utilizzo. $$. Questo funziona perfettamente, e dopo ulteriori letture lo capisco completamente. Peccato per la vergogna che non ci sia un lavoro intorno a dove posso usare la semplice fodera. – davierc

Problemi correlati