sed
- Ricerca e sostituzione¶
sed
è un comando che sta per "stream editor"
Convenzioni¶
path
: Il percorso effettivo. Esempio:/var/www/html/
filename
: il nome effettivo del file. Esempio:index.php
Utilizzo di sed
¶
L'uso di sed
per la ricerca e la sostituzione è la mia preferenza personale perché si può usare un delimitatore a scelta, il che rende molto comoda la sostituzione di cose come i collegamenti web con "/". Gli esempi predefiniti per l'editing sul posto usando sed
mostrano cose come questo esempio:
sed -i 's/search_for/replace_with/g' /path/filename
Ma cosa succede se si cercano stringhe che contengono "/"? Se la barra in avanti fosse l'unica opzione disponibile come delimitatore, dovremmo fare l'escape di ogni barra in avanti prima di poterla usare nella ricerca. È qui che sed
eccelle rispetto ad altri strumenti, perché il delimitatore è modificabile al volo (non è necessario specificare che lo si sta cambiando da qualche parte). Come detto, se si cercano cose con "/", si può facilmente farlo cambiando il delimitatore in "|". Ecco un esempio di ricerca di un link con questo metodo:
sed -i 's|search_for/with_slash|replace_string|g' /path/filename
È possibile utilizzare qualsiasi carattere a singolo byte come delimitatore, ad eccezione di backslash, newline e "s". Ad esempio, funziona anche questo:
sed -i 'sasearch_forawith_slashareplace_stringag' /path/filename
where "a" is the delimiter, and the search and replace still works. Per sicurezza, è possibile specificare un backup durante la ricerca e la sostituzione, utile per assicurarsi che le modifiche apportate con sed
siano quelle realmente desiderate. In questo modo si ottiene un'opzione di ripristino dal file di backup:
sed -i.bak s|search_for|replacea_with|g /path/filename
Che creerà una versione non modificata del filename
chiamata filename.bak
Se volete, potete anche usare le doppie virgolette invece di quelle singole:
sed -i "s|search_for/with_slash|replace_string|g" /path/filename
Descrizione Opzioni¶
Opzione | Spiegazione |
---|---|
i | modifica il file in posizione |
i.ext | crea un backup con qualsiasi estensione (ext qui) |
s | specifica la ricerca |
g | specifica di sostituire globalmente, in altre parole tutte le occorrenze |
File multipli¶
Sfortunatamente, sed
non ha un'opzione di looping in linea come il perl
. Per scorrere più file, è necessario combinare il comando sed
all'interno di uno script. Ecco un esempio di come farlo.
Per prima cosa, generate un elenco di file che il vostro script utilizzerà, che può essere inserito alla riga di comando:
find /var/www/html -name "*.php" > phpfiles.txt
Quindi, create uno script per utilizzare il file phpfiles.txt:
#!/bin/bash
for file in `cat phpfiles.txt`
do
sed -i.bak 's|search_for/with_slash|replace_string|g' $file
done
phpfiles.txt
, crea un backup di ogni file ed esegue la stringa di ricerca e sostituzione a livello globale. Una volta verificato che la ricerca e la sostituzione siano state completate correttamente e che le modifiche siano quelle desiderate, è possibile eliminare tutti i file di backup.
Altre letture ed esempi¶
sed
pagina del manualesed
esempi aggiuntivised
eawk
Libro O'Reilly
Conclusione¶
sed
è uno strumento potente e funziona molto bene per le funzioni di ricerca e sostituzione, in particolare quando il delimitatore deve essere flessibile.
Author: Steven Spencer