2013-05-27 9 views
27

Sto tentando di utilizzare SED tramite il terminale OS X per eseguire una ricerca e sostituzione.Come utilizzare SED per trovare e sostituire stringhe di URL con il carattere "/" nelle stringhe di destinazione?

Immaginate ho questa stringa disseminato in tutto il file di testo: http://www.find.com/page

E voglio sostituirlo con questa stringa: http://www.replace.com/page

Ho problemi perché io non sono sicuro di come sfuggire correttamente o usa il carattere "/" nelle mie stringhe. Per esempio, se ho semplicemente voluto trovare "gatto" e sostituirlo con "cane" Ho trovato il seguente comando che funziona perfettamente:

sed -i '' 's/cat/dog/g' file.txt 

Qualcuno ha qualche idea su come ottenere la stessa funzionalità solo che invece di gatto e cane hanno stringhe o URL che contengono il carattere "/"? Ho provato molti modi diversi di sfuggire ai caratteri "/" ma poi sembra che SED non riesca più a "trovare" la stringa e non esegua alcuna ricerca di sostituzione. &.

Qualsiasi aiuto o consiglio è molto apprezzato.

Grazie!

risposta

73

/ non è il delimitatore in sed comandi, è solo uno di quelli possibili. Per questo esempio, è possibile ad esempio utilizzare , poiché non è in conflitto con le stringhe;

echo 'I think http://www.find.com/page is my favorite' | 
    sed 's,http://www.find.com/page,http://www.replace.com/page,g' 
+0

La capacità di Sed di supportare il separatore personalizzato rende le cose meno complicate. Grazie @ Joachim! –

22

sed può prendere qualunque cosa segue la "s" come separatore. Poiché si sta lavorando con URL, è buona norma utilizzare un diverso delimitatore diverso da / per non confondere sed quando la sostituzione termina e la sostituzione ha inizio.

Tuttavia, avendo detto che si può sicuramente usare / se lo si desidera anche. Hai solo bisogno di sfuggire al letterale /.

Quindi, è possibile fare:

sed 's/http:\/\/www.find.com\/page/http:\/\/www.replace.com\/page/g' input_file 

o utilizzare un delimitatore diverso per evitare di fare la vostra criptico sed più criptico.

sed 's#http://www.find.com/page#http://www.replace.com/page#g' input_file 
+0

Mi piace l'idea del delimitazione diversa –

+0

Utilizzando questo approccio, c'è un motivo per cui il seguente comando emette solo il file senza alcuna modifica? 'sed 's #: 0.0.1 #: new-build-number # g' some.yaml'. 1. La modifica non si verifica. 2. Non voglio che il file sia stampato, appena aggiornato. –

Problemi correlati