androide

Come usare sed per trovare e sostituire la stringa nei file

Linux Tutorial for Beginners: Introduction to Linux Operating System

Linux Tutorial for Beginners: Introduction to Linux Operating System

Sommario:

Anonim

Abbastanza spesso quando si lavora con file di testo è necessario trovare e sostituire stringhe di testo in uno o più file.

sed è un sogno. Può eseguire manipolazioni di testo di base su file e flussi di input come pipeline. Con sed puoi cercare, trovare e sostituire, inserire ed eliminare parole e righe. Supporta espressioni regolari di base ed estese che consentono di abbinare modelli complessi.

, parleremo di come trovare e sostituire le stringhe con sed . Ti mostreremo anche come eseguire una ricerca ricorsiva e sostituirla.

Trova e sostituisci la stringa con sed

Esistono diverse versioni di sed , con alcune differenze funzionali tra loro. macOS utilizza la versione BSD e la maggior parte delle distribuzioni Linux viene fornita con GNU sed preinstallato di default. Useremo la versione GNU.

La forma generale di ricerca e sostituzione del testo usando sed assume la forma seguente:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Di default sed scrive il suo output nell'output standard. Questa opzione dice a sed di modificare i file in atto. Se viene fornita un'estensione (ex -i.bak) verrà creato un backup del file originale. s - Il comando sostitutivo, probabilmente il comando più usato in sed. / / / - Carattere delimitatore. Può essere qualsiasi personaggio ma di solito viene utilizzato il carattere barra ( / ). 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 modifica solo la prima occorrenza di SEARCH_REGEX su una riga. Quando viene fornito il flag di sostituzione, tutte le occorrenze verranno sostituite. INPUTFILE - Il nome del file su cui si desidera eseguire il comando.

È buona norma inserire virgolette attorno all'argomento in modo che i meta-personaggi della shell non si espandano.

Vediamo esempi su come usare il comando sed per cercare e sostituire il testo nei file con alcune delle sue opzioni e flag più comunemente usate.

A scopo dimostrativo, utilizzeremo il seguente file:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Con il flag di sostituzione globale sed sostituisce tutte le occorrenze del modello di ricerca:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Come avrai notato, nell'esempio precedente viene anche sostituita la sottostringa foo all'interno della stringa foobar . Se questo non è il comportamento desiderato, utilizzare l'espressione di limite di parole ( \b ) ad entrambe le estremità della stringa di ricerca. Questo assicura che le parole parziali non siano abbinate.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Per rendere insensibile al maiuscolo / minuscolo del motivo, utilizzare il flag I Nell'esempio seguente stiamo usando entrambi i flag g e I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

L'opzione più semplice e molto più leggibile è usare un altro carattere delimitatore. Molte persone usano 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 di 3 cifre e sostituirli con il number stringa che useresti:

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 usato più volte.

Ad esempio, se si desidera aggiungere parentesi graffe {} attorno a ciascun numero di 3 cifre, digitare:

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 fare un backup quando si modifica un file con sed . Per fare ciò basta fornire un'estensione all'opzione -i . Ad esempio, per modificare file.txt e salvare il file originale come file.txt.bak dovrai usare:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Trova e sostituisci ricorsivo

A volte si desidera cercare ricorsivamente nelle directory i file contenenti una stringa e sostituire la stringa in tutti i file. Questo può essere fatto usando comandi come find o grep per trovare ricorsivamente i file nella directory e reindirizzare i nomi dei file su sed .

Il seguente comando cercherà ricorsivamente i file nella directory di lavoro corrente e passerà i nomi dei file a sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Per evitare problemi con i file che contengono spazio nei loro nomi usa l'opzione -print0 che dice a find di stampare il nome del file, seguito da un carattere null e reindirizza l'output a sed usando xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Per escludere una directory utilizzare l'opzione -not -path . Ad esempio, se si sta sostituendo una stringa nel repository git locale per escludere tutti i file che iniziano con punto ( . ), Utilizzare:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Un'altra opzione è quella di utilizzare il comando grep per trovare ricorsivamente tutti i file contenenti il ​​modello di ricerca e quindi reindirizzare i nomi dei file su sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Conclusione

Sebbene all'inizio possa sembrare complicato e complesso, la ricerca e la sostituzione del testo nei file con sed è molto semplice.

Per saperne di più sui comandi, le opzioni e i flag sed, visita il manuale GNU sed e il tutorial Grymoire sed. Se hai domande o feedback, non esitare a lasciare un commento.

sed terminal