Quando si lavora con i file di testo, è spesso necessario trovare e sostituire le stringhe di testo in uno o più file.
sed
è un editor di stream. Può eseguire la manipolazione di testo di base su file e flussi di input come le pipeline. Con sed
, è possibile cercare, trovare e sostituire, inserire ed eliminare parole e righe. Supporta le espressioni regolari di base ed estese che consentono di abbinare modelli complessi.,
In questo articolo, parleremo di come trovare e sostituire le stringhe con sed
. Ti mostreremo anche come eseguire una ricerca e una sostituzione ricorsiva.
Trova e sostituisci la stringa con sed #
Esistono diverse versioni dised
, con alcune differenze funzionali tra di loro. macOS utilizza la versione BSD, mentre la maggior parte delle distribuzioni Linux sono dotate di GNU sed
preinstallato per impostazione predefinita. Useremo la versione GNU.,
La forma generale di ricerca e sostituzione di testo utilizzando sed
assume la seguente forma:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
defaultsed
scrive il risultato sullo standard output. Questa opzione indica ased
di modificare i file in posizione. Se viene fornita un’estensione (ex-i. bak), viene creato un backup del file originale. -
s
– Il comando sostitutivo, probabilmente il comando più usato in sed. -
/ / /
– Carattere delimitatore., Può essere qualsiasi carattere, ma di solito viene utilizzato il carattere slash (/
). -
SEARCH_REGEX
– Stringa normale o un’espressione regolare da cercare. -
REPLACEMENT
– La stringa di sostituzione. -
g
– Flag di sostituzione globale. Per impostazione predefinita,sed
legge il file riga per riga e cambia solo la prima occorrenza diSEARCH_REGEX
su una riga. Quando viene fornito il flag di sostituzione, tutte le occorrenze vengono sostituite., -
INPUTFILE
– Il nome del file su cui si desidera eseguire il comando.
È una buona pratica mettere virgolette attorno all’argomento in modo che i meta-caratteri della shell non si espandano.
Vediamo come possiamo usare il comando sed
per cercare e sostituire il testo nei file con alcune delle opzioni e dei flag più comunemente usati.
A scopo dimostrativo, utilizzeremo il seguente file:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Se g
flag viene omesso, solo la prima istanza della stringa di ricerca in ogni riga è sostituita:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Con la sostituzione globale, bandiera sed
sostituisce tutte le occorrenze del pattern di ricerca:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Come si può notare, la sottostringa foo
all’interno del tag foobar
string è anche sostituito nell’esempio precedente., Se questo non è il comportamento desiderato, utilizzare l’espressione limite della parola (\b
) ad entrambe le estremità della stringa di ricerca. Ciò garantisce che le parole parziali non siano abbinate.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
Per rendere il modello di corrispondenza case insensitive, utilizzare ilI
bandiera., Nell’esempio riportato di seguito che stiamo usando sia il g
e I
bandiere:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Se si desidera trovare e sostituire una stringa che contiene il carattere delimitatore (/
) è necessario utilizzare la barra rovesciata (\
) per sfuggire alla barra. Ad esempio, per sostituire /bin/bash
con /usr/bin/zsh
dovresti usare
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
L’opzione più semplice e molto più leggibile è usare un altro carattere delimitatore., La maggior parte delle persone usa la barra verticale (|
) o i due punti (:
) ma puoi usare qualsiasi altro carattere:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
Puoi anche usare espressioni regolari. Ad esempio, per cercare tutti i numeri a 3 cifre e sostituirli con la stringa number
dovresti usare:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
Un’altra caratteristica utile di sed è che puoi usare il carattere commerciale &
che corrisponde al modello abbinato., Il personaggio può essere utilizzato più volte.
Per esempio, se si desidera aggiungere le parentesi graffe {}
intorno a ogni numero di 3 cifre, tipo:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Ultimo ma non meno importante, è sempre una buona idea per fare un backup quando si modifica un file con sed
. Per fare ciò, basta fornire un’estensione per il file di backup all’opzione-i
., Per esempio, per modificare il file.txt
e salvare il file originale file.txt.bak
si usa:
sed -i.bak 's/foo/linux/g' file.txt
assicurarsi che il backup è stato creato, visualizzare l’elenco dei file con ls
comando:
ls
file.txt file.txt.bak
Ricorsiva Trova e Sostituisci #
a Volte si desidera in modo ricorsivo directory ricerca per i file che contengono una stringa e sostituire la stringa in tutti i file., Questo può essere fatto usando comandi comefind
ogrep
per trovare ricorsivamente i file nella directory e convogliare i nomi dei file insed
.
Il seguente comando cercherà ricorsivamente i file nella directory di lavoro corrente e passerà i nomi dei file ased
.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
Per evitare problemi con i file contenenti spazi nei nomi, utilizzare il tag -print0
opzione, che dice find
per stampare il nome del file, seguito da un carattere null e pipe l’output sed
uso xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
Per escludere una directory, utilizzare il tag -not -path
opzione.,avviamento con dot (.
), uso:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Se si desidera cercare e sostituire il testo solo nei file con estensione specifica, utilizzare:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
un’Altra opzione è quella di utilizzare il grep
comando in modo ricorsivo trovare tutti i file che contengono il pattern di ricerca e quindi il tubo che i nomi dei file sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Conclusione #
anche se può sembrare complicato e complesso, in un primo momento, la ricerca e sostituzione di testo in file con sed
è molto semplice.,
Per ulteriori informazioni su sed
comandi, opzioni e flag, visitare il manuale GNU sed e il tutorial Grymoire sed .
Leave a Reply