# Référence rapide sed

*Édition de flux, substitution, adresses, espace tampon, transformations en place*

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

## Bases

### Exécuter 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
```

### Options de ligne de commande

| Command | Description |
|---------|-------------|
| `-n` | Supprimer l'impression automatique ; imprimer uniquement avec `p` |
| `-e 'cmd'` | Exécuter une commande sed (enchaîner avec plusieurs `-e`) |
| `-f script.sed` | Lire les commandes depuis un fichier |
| `-i[suffix]` | Modifier le fichier en place (suffixe de sauvegarde optionnel) |
| `-E / -r` | Utiliser les expressions régulières étendues |

## Substitution

### Syntaxe de substitution

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

### Indicateurs de substitution

| Command | Description |
|---------|-------------|
| `g` | Remplacer toutes les occurrences sur la ligne |
| `N (number)` | Remplacer uniquement la N-ième occurrence |
| `p` | Imprimer la ligne si une substitution a été faite |
| `w file` | Écrire les lignes substituées dans un fichier |
| `i / I` | Correspondance insensible à la casse (GNU) |

## Adresses

### Exemples d'adresses

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

### Types d'adresses

| Command | Description |
|---------|-------------|
| `N` | Numéro de ligne N |
| `$` | Dernière ligne |
| `N,M` | Plage de lignes de N à M |
| `/regex/` | Lignes correspondant à regex |
| `/regex1/,/regex2/` | Plage de la première à la deuxième correspondance |
| `N~step` | À partir de N, chaque N-ième ligne (GNU) |
| `addr!` | Négation — appliquer aux lignes non correspondantes |

## Suppression et impression

### Commandes de suppression et impression

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

### Référence des commandes

| Command | Description |
|---------|-------------|
| `d` | Supprimer l'espace de motif, démarrer le cycle suivant |
| `D` | Supprimer jusqu'au premier saut de ligne dans l'espace de motif |
| `p` | Imprimer l'espace de motif |
| `P` | Imprimer jusqu'au premier saut de ligne dans l'espace de motif |
| `q` | Quitter après avoir imprimé l'espace de motif actuel |
| `Q` | Quitter sans imprimer (GNU) |

## Insertion et ajout

### Insérer, ajouter, changer

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

### Commandes

| Command | Description |
|---------|-------------|
| `i\text` | Insérer du texte avant la ligne actuelle |
| `a\text` | Ajouter du texte après la ligne actuelle |
| `c\text` | Remplacer la ligne actuelle par du texte |
| `r file` | Lire et ajouter le contenu d'un fichier |
| `R file` | Lire et ajouter une ligne depuis un fichier (GNU) |
| `w file` | Écrire l'espace de motif dans un fichier |

## Espace tampon

### Commandes de l'espace tampon

| Command | Description |
|---------|-------------|
| `h` | Copier l'espace de motif dans l'espace tampon |
| `H` | Ajouter l'espace de motif à l'espace tampon |
| `g` | Copier l'espace tampon dans l'espace de motif |
| `G` | Ajouter l'espace tampon à l'espace de motif |
| `x` | Échanger les espaces de motif et tampon |

### Exemples d'espace tampon

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

## Commandes multiples

### Enchaîner les commandes

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

### Regroupement et branchement

| Command | Description |
|---------|-------------|
| `{ cmd1; cmd2; }` | Regrouper des commandes pour la même adresse |
| `:label` | Définir une étiquette de branchement |
| `b label` | Branchement (saut) vers une étiquette |
| `t label` | Brancher si le dernier `s///` a réussi |
| `T label` | Brancher si le dernier `s///` a échoué (GNU) |

## Édition en place

### Exemples d'édition en 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
```

### Notes sur les plateformes

| Command | Description |
|---------|-------------|
| `GNU sed -i` | Le suffixe est optionnel ; `-i` seul édite sans sauvegarde |
| `BSD/macOS sed -i` | Requiert un argument suffixe ; utiliser `-i ''` pour aucune sauvegarde |
| `-i.bak` | Crée un fichier de sauvegarde avec l'extension `.bak` |
| `Multiple files` | `sed -i 's/a/b/g' *.txt` édite tous les fichiers correspondants |

## Regex

### Regex dans sed

| Command | Description |
|---------|-------------|
| `.` | N'importe quel caractère unique |
| `*` | Zéro ou plusieurs du précédent |
| `\+` | Un ou plusieurs (BRE) — `+` en ERE |
| `\?` | Zéro ou un (BRE) — `?` en ERE |
| `^` | Début de ligne |
| `$` | Fin de ligne |
| `[abc]` | Classe de caractères |
| `\( \)` | Groupe capturant (BRE) — `()` en ERE |
| `\1, \2` | Référence arrière au groupe capturant |
| `&` | Chaîne entière correspondante (dans le remplacement) |

### Exemples de 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
```

## Motifs courants

### Lignes de commande courtes

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

### Recettes

| Command | Description |
|---------|-------------|
| `Double-space` | `sed G` — ajouter une ligne vide après chaque ligne |
| `Remove HTML tags` | `sed 's/<[^>]*>//g'` |
| `Extract emails` | `sed -nE 's/.*([a-z]+@[a-z.]+).*/\1/p'` |
| `Comment lines` | `sed 's/^/# /'` — préfixer chaque ligne avec `# ` |
| `Trim blank lines at EOF` | `sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'` |
| `Replace nth line` | `sed 'Nc\new text'` — remplacer la ligne N |
