Vai al contenuto

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
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 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

Conclusione

sed è uno strumento potente e funziona molto bene per le funzioni di ricerca e sostituzione, in particolare quando il delimitatore deve essere flessibile.


Ultimo aggiornamento: 31 maggio 2022

Author: Steven Spencer