# Riferimento rapido sed

*Editing di flusso, sostituzioni, indirizzi, hold space, trasformazioni in-place*

> Source: GNU sed Manual (gnu.org/software/sed) · MIT

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

| Command | Description |
|---------|-------------|
| `-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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `{ 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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `.` | 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

| Command | Description |
|---------|-------------|
| `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 |
