RIFERIMENTO RAPIDO SED
Editing di flusso, sostituzioni, indirizzi, hold space, trasformazioni in-place
Nozioni di base
Esecuzione di sed
sed 's/old/new/' file.txt # substitute first match per line
sed 's/old/new/g' file.txt # substitute all matches per line
sed -n '5p' file.txt # print only line 5
sed '3d' file.txt # delete line 3
echo "hello" | sed 's/hello/hi/' # pipe input
Flag da riga di comando
| -n | Sopprime la stampa automatica; stampa solo con p |
| -e 'cmd' | Esegue un comando sed (concatena più con -e) |
| -f script.sed | Legge i comandi da un file |
| -i[suffisso] | Modifica il file in-place (suffisso di backup opzionale) |
| -E / -r | Usa espressioni regolari estese |
Sostituzione
Sintassi della sostituzione
sed 's/foo/bar/' f # first occurrence per line
sed 's/foo/bar/g' f # all occurrences
sed 's/foo/bar/3' f # 3rd occurrence only
sed 's/foo/bar/gi' f # all, case-insensitive
sed 's|/usr/bin|/opt/bin|g' f # alternate delimiter
Flag di sostituzione
| g | Sostituisce tutte le occorrenze sulla riga |
| N (numero) | Sostituisce solo la N-esima occorrenza |
| p | Stampa la riga se la sostituzione è avvenuta |
| w file | Scrive le righe sostituite su file |
| i / I | Corrispondenza case-insensitive (GNU) |
Indirizzi
Esempi di indirizzo
sed '3s/a/b/' f # only on line 3
sed '2,5s/a/b/' f # lines 2 through 5
sed '/^#/d' f # delete lines starting with #
sed '/start/,/end/d' f # delete range between patterns
sed '1~2d' f # delete odd-numbered lines (GNU)
Tipi di indirizzo
| N | Riga numero N |
| $ | Ultima riga |
| N,M | Intervallo di righe da N a M |
| /regex/ | Righe che corrispondono alla regex |
| /regex1/,/regex2/ | Intervallo dalla prima alla seconda corrispondenza |
| N~step | A partire da N, ogni step righe (GNU) |
| addr! | Negazione — applica alle righe non corrispondenti |
Elimina e stampa
Comandi di eliminazione e stampa
sed '5d' f # delete line 5
sed '/^$/d' f # delete blank lines
sed -n '10,20p' f # print lines 10–20
sed -n '/error/p' f # print lines matching pattern
sed '/debug/!d' f # keep only matching lines
Riferimento comandi
| d | Elimina il pattern space, inizia il ciclo successivo |
| D | Elimina fino al primo newline nel pattern space |
| p | Stampa il pattern space |
| P | Stampa fino al primo newline nel pattern space |
| q | Esce dopo aver stampato il pattern space corrente |
| Q | Esce senza stampare (GNU) |
Inserisci e aggiungi
Inserimento, aggiunta, modifica
sed '3i\inserted line' f # insert before line 3
sed '3a\appended line' f # append after line 3
sed '3c\replaced line' f # replace line 3
sed '/marker/a\new line' f # append after pattern match
Comandi
| i\testo | Inserisce testo prima della riga corrente |
| a\testo | Aggiunge testo dopo la riga corrente |
| c\testo | Sostituisce la riga corrente con testo |
| r file | Legge e aggiunge il contenuto del file |
| R file | Legge e aggiunge una riga dal file (GNU) |
| w file | Scrive il pattern space su file |
Hold space
Comandi dell'hold space
| h | Copia il pattern space nell'hold space |
| H | Aggiunge il pattern space all'hold space |
| g | Copia l'hold space nel pattern space |
| G | Aggiunge l'hold space al pattern space |
| x | Scambia pattern e hold space |
Esempi con hold space
sed -n '1!G;h;$p' f # reverse lines (tac)
sed '/^$/{ x; s/\n//; x; }' f # collapse hold on blank
sed -n 'H;${x;s/\n/ /g;p;}' f # join all lines with space
Comandi multipli
Concatenazione di comandi
sed -e 's/foo/bar/g' -e 's/baz/qux/g' f
sed 's/foo/bar/g; s/baz/qux/g' f
sed '/header/{ s/old/new/; s/foo/bar/; }' f
sed -f commands.sed input.txt
Raggruppamento e diramazione
| { cmd1; cmd2; } | Raggruppa comandi per lo stesso indirizzo |
| :etichetta | Definisce un'etichetta di diramazione |
| b etichetta | Salta all'etichetta |
| t etichetta | Salta se l'ultimo s/// è riuscito |
| T etichetta | Salta se l'ultimo s/// è fallito (GNU) |
Modifica in-place
Esempi in-place
sed -i 's/old/new/g' file.txt # edit in place (GNU)
sed -i.bak 's/old/new/g' file.txt # backup as file.txt.bak
sed -i '' 's/old/new/g' file.txt # macOS in-place (no backup)
sed -i '/^#/d' config.txt # remove comments in place
Note di piattaforma
| GNU sed -i | Il suffisso è opzionale; -i da solo modifica senza backup |
| BSD/macOS sed -i | Richiede argomento suffisso; usa -i '' per nessun backup |
| -i.bak | Crea un file di backup con estensione .bak |
| File multipli | sed -i 's/a/b/g' *.txt modifica tutti i file corrispondenti |
Regex
Regex in sed
| . | Qualsiasi carattere singolo |
| * | Zero o più del precedente |
| \+ | Uno o più (BRE) — + in ERE |
| \? | Zero o uno (BRE) — ? in ERE |
| ^ | Inizio riga |
| $ | Fine riga |
| [abc] | Classe di caratteri |
| \( \) | Gruppo di cattura (BRE) — () in ERE |
| \1, \2 | Backreference al gruppo di cattura |
| & | Intera stringa corrispondente (nella sostituzione) |
Esempi di regex
sed 's/[0-9]\+/NUM/g' f # replace numbers
sed -E 's/(foo)(bar)/\2\1/g' f # swap groups (ERE)
sed 's/.*/(&)/' f # wrap line in parens
sed 's/[ \t]*$//' f # strip trailing whitespace
Pattern comuni
One-liner
sed -n '1p' f # first line (head -1)
sed '$!d' f # last line (tail -1)
sed '/^$/d' f # remove blank lines
sed 's/^[ \t]*//' f # strip leading whitespace
sed '=' f | sed 'N;s/\n/\t/' f # number lines
Ricette
| Doppio spazio | sed G — aggiunge riga vuota dopo ogni riga |
| Rimuovi tag HTML | sed 's/<[^>]*>//g' |
| Estrai email | sed -nE 's/.*([a-z]+@[a-z.]+).*/\1/p' |
| Commenta righe | sed 's/^/# /' — prefissa ogni riga con # |
| Elimina righe vuote a fine file | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' |
| Sostituisci riga N-esima | sed 'Nc\nuovo testo' — sostituisce la riga N |