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? È necessario evitare ogni barra in avanti prima di poterla utilizzare 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 già detto, se si cercano elementi con "/", è possibile 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
È anche possibile utilizzare le doppie virgolette invece delle virgolette 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, ovvero tutte le occorrenze |
File multipli¶
Sfortunatamente, sed
non ha un'opzione di looping in linea come perl
. Per scorrere più file, è necessario combinare il comando sed
all'interno di uno script. Ecco un esempio di come farlo.
Per prima cosa, generare un elenco di file che lo script utilizzerà. Eseguire questa operazione dalla riga di comando con:
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
Lo script scorre tutti i file creati in phpfiles.txt
, crea un backup di ogni file ed esegue la stringa di ricerca e sostituzione a livello globale. Una volta verificato 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