# sed (Stream Editor)

**sed** (*stream editor*) és una eina Unix/Linux de línia d'ordres que processa text línia a línia aplicant-hi transformacions definides per scripts. És no interactiu, llegeix d'un flux d'entrada (fitxer o stdin) i escriu el resultat a stdout.

## 1. Com funciona sed

sed segueix un **cicle de processament** per a cada línia:

1. Llegeix una línia del flux d'entrada → l'emmagatzema a l'espai de patrons
2. Aplica totes les ordres de l'script (si l'adreça coincideix)
3. Imprimeix l'espai de patrons a stdout (tret que s'indiqui -n)
4. Esborra l'espai de patrons i torna al pas 1

![Cicle sed](https://proferamon.com/tic/imatges/sed/sed01.png)

## 2. Sintaxi general

```bash
sed [OPCIONS] 'SCRIPT' [FITXER...]
sed [OPCIONS] -e 'ORDRE1' -e 'ORDRE2' [FITXER...]
sed [OPCIONS] -f script.sed [FITXER...]
```

Estructura d'una ordre dins de l'script:

```bash
[ADREÇA[,ADREÇA]] ORDRE [ARGUMENTS]
```

- L'**adreça** és opcional. Si no s'especifica, l'ordre s'aplica a totes les línies.
- Si es donen **dues adreces** separades per comes, l'ordre s'aplica al rang.

## 3. Adreces (selecció de línies)

### 3.1 Per número de línia

| Adreça         | Descripció                              |
|----------------|-----------------------------------------|
| `N`            | Línia número N                          |
| `$`            | Última línia                            |
| `N,M`          | Del rang de línia N fins M              |
| `N~P`          | Cada P línies a partir de N (GNU sed)   |
| `0,/regex/`    | Des de l'inici fins a la 1a coincidència  |

```bash
sed '3d' fitxer.txt          # Elimina la línia 3
sed '2,5d' fitxer.txt        # Elimina les línies 2 a 5
sed '$d' fitxer.txt          # Elimina l'última línia
sed '1~2d' fitxer.txt        # Elimina les línies imparelles (1,3,5...)
sed '0~2d' fitxer.txt        # Elimina les línies parelles (2,4,6...)
```

### 3.2 Per expressió regular

| Adreça          | Descripció                                   |
|-----------------|----------------------------------------------|
| `/regex/`       | Línies que coincideixen amb el patró         |
| `/regex/,/end/` | Rang: des del patró fins al de tancament     |
| `\|regex|`      | Delimitador alternatiu (GNU sed)             |

```bash
sed '/^#/d' fitxer.txt              # Elimina línies que comencen per #
sed '/inici/,/fi/d' fitxer.txt      # Elimina el bloc entre 'inici' i 'fi'
sed '\|/usr/bin|d' fitxer.txt       # Usa | com a delimitador (per a paths)
```

### 3.3 Negació d'adreça

Afegint `!` després de l'adreça s'inverteix la selecció:

```bash
sed '/patró/!d' fitxer.txt    # Elimina les línies que NO coincideixen
sed '1!d' fitxer.txt          # Elimina totes les línies excepte la 1a
```

## 4. Ordres principals

### `s` — Substitució

L'ordre més usada. Substitueix un patró per un altre.

```bash
s/REGEXP/REEMPLAÇAMENT/[FLAGS]
```

```bash
sed 's/hola/adéu/' fitxer.txt          # Substitueix la 1a ocurrència per línia
sed 's/hola/adéu/g' fitxer.txt         # Substitueix totes les ocurrències
sed 's/hola/adéu/2' fitxer.txt         # Substitueix la 2a ocurrència
sed 's/hola/adéu/gi' fitxer.txt        # Global + insensible a majúscules
```

**Grups de captura** (referències a subexpressions):

```bash
# \1, \2... fan referència als grups () de l'expressió regular
sed 's/\(paraula1\) \(paraula2\)/\2 \1/' fitxer.txt   # Intercanvia dues paraules
sed -E 's/(paraula1) (paraula2)/\2 \1/' fitxer.txt    # Amb -E (ERE), sense escapar ()

# & representa el patró sencer que ha coincidit
sed 's/[0-9]*/[&]/' fitxer.txt          # Envolta números entre claudàtors
```

### `d` — Eliminació (delete)

Elimina les línies seleccionades i passa a la següent iteració.

```bash
sed '/^$/d' fitxer.txt          # Elimina línies buides
sed '/^[[:space:]]*$/d' fitxer.txt   # Elimina línies buides o amb espais
sed '1,3d' fitxer.txt           # Elimina les tres primeres línies
```

### `p` — Impressió (print)

Imprimeix explícitament l'espai de patrons. Normalment s'usa amb `-n`.

```bash
sed -n '/patró/p' fitxer.txt    # Imprimeix només les línies que coincideixen
sed -n '5,10p' fitxer.txt       # Imprimeix les línies 5-10
sed -n '$p' fitxer.txt          # Imprimeix l'última línia
```

### `q` i `Q` — Sortida (quit)

```bash
sed '5q' fitxer.txt             # Imprimeix fins la línia 5 i surt
sed '5Q' fitxer.txt             # Surt en arribar a la línia 5 (sense imprimir-la)
```

### `a` — Afegir text (append)

Afegeix text **després** de la línia seleccionada.

```bash
sed '/patró/a\Text nou' fitxer.txt
sed '3a\Línia nova' fitxer.txt   # Afegeix text després de la línia 3
```

### `i` — Inserir text (insert)

Afegeix text **abans** de la línia seleccionada.

```bash
sed '/patró/i\Text inserit' fitxer.txt
sed '1i\Primera línia nova' fitxer.txt
```

### `c` — Canviar línia (change)

Substitueix la línia sencera per un text nou.

```bash
sed '/patró/c\Línia completament nova' fitxer.txt
sed '5c\Reemplaça la línia 5' fitxer.txt
```

### `y` — Transliteració

Substitueix caràcter a caràcter (similar a `tr`).

```bash
sed 'y/abc/ABC/' fitxer.txt           # Converteix a/b/c en A/B/C
sed 'y/àáâãäå/aaaaaa/' fitxer.txt     # Elimina accents (alguns casos)
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' f.txt  # Minúscules
```

### `=` — Número de línia

Imprimeix el número de línia actual.

```bash
sed -n '/patró/=' fitxer.txt     # Mostra en quines línies apareix el patró
sed '=' fitxer.txt               # Numera totes les línies
```

### `r` i `w` — Lectura i escriptura de fitxers

```bash
sed '/patró/r contingut.txt' fitxer.txt   # Insereix contingut.txt després de les línies que coincideixen
sed -n '/patró/w sortida.txt' fitxer.txt  # Escriu les línies coincidents a un fitxer
```

### `n` i `N` — Avançar línia

```bash
# n: imprimeix l'espai de patrons i llegeix la línia següent
# N: afegeix la línia següent a l'espai de patrons (separada per \n)
sed 'N;s/\n/ /' fitxer.txt     # Uneix cada parell de línies en una
```

### `l` — Mostrar caràcters no imprimibles

```bash
sed -n 'l' fitxer.txt    # Mostra caràcters de control, tabs, etc.
```

## 5. Expressions regulars a sed

Per defecte, sed usa **BRE** (Basic Regular Expressions). Amb `-E` s'activen **ERE** (Extended Regular Expressions).

### 5.1 Metacaràcters BRE

| Patró       | Significat                              |
|-------------|----------------------------------------|
| `.`         | Qualsevol caràcter (excepte newline)   |
| `*`         | Zero o més repeticions de l'anterior   |
| `^`         | Inici de línia                         |
| `$`         | Fi de línia                            |
| `[abc]`     | Qualsevol dels caràcters del conjunt   |
| `[^abc]`    | Cap dels caràcters del conjunt         |
| `\+`        | Una o més repeticions (BRE)            |
| `\?`        | Zero o una repetició (BRE)             |
| `\{n,m\}`   | Entre n i m repeticions (BRE)          |
| `\(grup\)`  | Grup de captura (BRE)                  |
| `\1`        | Referència al grup 1                   |

### 5.2 Metacaràcters ERE (amb `-E`)

| Patró       | Significat                              |
|-------------|----------------------------------------|
| `+`         | Una o més repeticions                  |
| `?`         | Zero o una repetició                   |
| `{n,m}`     | Entre n i m repeticions                |
| `(grup)`    | Grup de captura                        |
| `a\|b`      | Alternativa: a o b                     |

### 5.3 Classes de caràcters POSIX

| Classe          | Equivalent a           |
|-----------------|------------------------|
| `[[:alpha:]]`   | Lletres [a-zA-Z]       |
| `[[:digit:]]`   | Dígits [0-9]           |
| `[[:alnum:]]`   | Alfanumèric            |
| `[[:space:]]`   | Espais, tab, newline   |
| `[[:upper:]]`   | Majúscules             |
| `[[:lower:]]`   | Minúscules             |
| `[[:punct:]]`   | Puntuació              |
| `[[:blank:]]`   | Espai i tab            |

```bash
sed 's/[[:digit:]]\+/NUM/g' fitxer.txt      # Substitueix números per "NUM"
sed 's/[[:space:]]\+/ /g' fitxer.txt        # Comprimeix espais múltiples
sed '/^[[:space:]]*$/d' fitxer.txt          # Elimina línies buides/en blanc
```

## 6. Flags de l'ordre `s`

| Flag     | Descripció                                         |
|----------|----------------------------------------------------|
| `g`      | Global: substitueix totes les ocurrències          |
| `N`      | Substitueix la N-èsima ocurrència                  |
| `i` / `I`| Insensible a majúscules/minúscules                 |
| `p`      | Imprimeix la línia si hi ha substitució            |
| `w FITX` | Escriu la línia modificada al fitxer especificat   |
| `e`      | Executa el resultat com a ordre de shell (GNU)   |

```bash
sed -n 's/patró/reemplaçament/p' f.txt      # Imprimeix només les línies modificades
sed 's/patró/reemplaçament/2g' f.txt        # Substitueix des de la 2a ocurrència
sed 's/patró/reemplaçament/w canvis.txt' f.txt  # Desa les línies modificades
sed 's/echo \(.*\)/\1/e' f.txt         # Executa el resultat (¡CUIDADO!)
```

## 7. Opcions de la línia d'ordres

| Opció          | Descripció                                              |
|----------------|---------------------------------------------------------|
| `-n`           | Suprimeix la impressió automàtica                       |
| `-e 'CMD'`     | Afegeix una ordre a l'script                           |
| `-f FITXER`    | Llegeix l'script des d'un fitxer                       |
| `-i[SUFIX]`    | Edita el fitxer en el lloc (in-place)                  |
| `-E` / `-r`    | Usa expressions regulars esteses (ERE)                  |
| `-s`           | Tracta cada fitxer com a independent (reinicia $)       |
| `--sandbox`    | Mode segur: desactiva r/w/e (GNU sed)                  |

### 7.1 Edició in-place (`-i`)

```bash
sed -i 's/vell/nou/g' fitxer.txt          # Modifica el fitxer directament
sed -i.bak 's/vell/nou/g' fitxer.txt      # Fa una còpia de seguretat .bak primer
sed -i'' 's/vell/nou/g' fitxer.txt        # macOS: -i requereix argument (pot ser buit)
```

> ⚠️ **Atenció**: `-i` sense còpia de seguretat és irreversible. Sempre prova sense `-i` primer.

## 8. L'espai de patrons i l'espai de retenció

sed té dos buffers interns:

- **Espai de patrons** (*pattern space*): conté la línia actual en procés.
- **Espai de retenció** (*hold space*): memòria auxiliar persistent entre iteracions.

### 8.1 Ordres de manipulació de buffers

| Ordre | Acció                                                    |
|---------|----------------------------------------------------------|
| `h`     | Copia l'espai de patrons a l'espai de retenció           |
| `H`     | Afegeix l'espai de patrons a l'espai de retenció         |
| `g`     | Copia l'espai de retenció a l'espai de patrons           |
| `G`     | Afegeix l'espai de retenció a l'espai de patrons         |
| `x`     | Intercanvia els dos espais                               |

```bash
# Invertir l'ordre de les línies d'un fitxer (similar a tac)
sed -n '1!G;h;$p' fitxer.txt

# Explicació:
# 1!G  → si NO és la 1a línia, afegeix hold space a pattern space
# h    → copia pattern space a hold space
# $p   → a l'última línia, imprimeix
```

```bash
# Duplicar cada línia
sed 'h;p;g' fitxer.txt

# Mostrar la línia anterior a cada coincidència
sed -n '/patró/{g;p};h' fitxer.txt
```

## 9. Scripts sed multiordre

Diverses ordres es poden combinar de diverses maneres:

```bash
# Amb -e
sed -e 's/foo/bar/g' -e 's/baz/qux/g' fitxer.txt

# Separades per ; dins el mateix -e
sed 's/foo/bar/g;s/baz/qux/g' fitxer.txt

# En un fitxer .sed
cat > script.sed << 'EOF'
s/foo/bar/g
s/baz/qux/g
/^#/d
EOF
sed -f script.sed fitxer.txt
```

### 9.1 Blocs `{}`

Agrupen ordres que s'apliquen a la mateixa adreça:

```bash
sed '/patró/{
  s/foo/bar/g
  s/baz/qux/g
  p
}' fitxer.txt
```

### 9.2 Etiquetes i salts (branching)

| Ordre  | Descripció                                         |
|----------|----------------------------------------------------|
| `:label` | Defineix una etiqueta                              |
| `b label`| Salt incondicional a l'etiqueta (o al final)       |
| `t label`| Salt si hi ha hagut substitució des de l'últim t   |
| `T label`| Salt si NO hi ha hagut substitució (GNU sed)       |

```bash
# Bucle: elimina espais al voltant de comes
sed ':loop; s/[[:space:]]*,[[:space:]]*/,/g; t loop' fitxer.txt

# Processa blocs multilínia
sed ':inici; /\\$/{ N; s/\\\n//; b inici }' fitxer.txt
```

## 10. Casos d'ús pràctics

### 10.1 Substitució de text

```bash
# Canviar una paraula
sed 's/Linux/GNU\/Linux/g' readme.txt

# Canviar URL en fitxers de configuració
sed -i 's|http://old.example.com|https://new.example.com|g' config.conf

# Substituir la contrasenya en un fitxer .env
sed -i 's/^DB_PASS=.*/DB_PASS=nova_contrasenya/' .env

# Capitalitzar la primera lletra de cada línia (GNU sed)
sed 's/./\u&/' fitxer.txt
```

### 10.2 Eliminar línies

```bash
# Eliminar comentaris (línies que comencen per #)
sed '/^#/d' fitxer.conf

# Eliminar línies buides
sed '/^$/d' fitxer.txt

# Eliminar línies buides múltiples (deixar només una)
sed '/^$/{ N; /^\n$/d }' fitxer.txt

# Eliminar espais al final de cada línia (trailing whitespace)
sed 's/[[:space:]]*$//' fitxer.txt

# Eliminar la capçalera (primeres N línies)
sed '1,5d' fitxer.txt

# Eliminar l'última línia
sed '$d' fitxer.txt
```

### 10.3 Extreure línies

```bash
# Extreure un rang de línies
sed -n '10,20p' fitxer.txt

# Extreure línies que coincideixen amb un patró
sed -n '/ERROR/p' log.txt

# Extreure el contingut entre dos patrons (inclosos)
sed -n '/INICI/,/FI/p' fitxer.txt

# Extreure el contingut entre dos patrons (exclosos)
sed -n '/INICI/,/FI/{/INICI/!{/FI/!p}}' fitxer.txt

# Mostrar les 10 primeres línies (com head)
sed '10q' fitxer.txt

# Mostrar l'última línia (com tail -1)
sed -n '$p' fitxer.txt
```

### 10.4 Transformació de formats

```bash
# Convertir CSV a una columna per línia
sed 's/,/\n/g' dades.csv

# Afegir comes al final de cada línia (JSON-ish)
sed 's/$/, /' fitxer.txt

# Convertir Windows (CRLF) a Unix (LF)
sed 's/\r//' fitxer.txt
# o
sed 's/\r$//' fitxer.txt

# Convertir Unix (LF) a Windows (CRLF)
sed 's/$/\r/' fitxer.txt

# Afegir un prefix a cada línia
sed 's/^/PREFIX: /' fitxer.txt

# Afegir un sufix a cada línia
sed 's/$/ :SUFIX/' fitxer.txt
```

### 10.5 Treballar amb fitxers de configuració

```bash
# Descomentar una línia específica
sed '/^#opcio_X/s/^#//' fitxer.conf

# Comentar una línia específica
sed '/^opcio_X/s/^/#/' fitxer.conf

# Canviar el valor d'una clau (format clau=valor)
sed 's/^MAX_CONNECTIONS=.*/MAX_CONNECTIONS=100/' config.ini

# Inserir una línia després d'una directiva
sed '/^\[seccio\]/a\nova_opcio=valor' fitxer.conf

# Eliminar una secció sencera (entre [seccio] i la següent secció)
sed '/^\[seccio_a_eliminar\]/,/^\[/{ /^\[seccio_a_eliminar\]/d; /^\[/!d }' fitxer.conf
```

### 10.6 Processar logs

```bash
# Extreure línies d'error d'un log
sed -n '/\[ERROR\]/p' aplicacio.log

# Extreure timestamps d'un log (format ISO)
sed -n 's/^\([0-9-]\{10\}T[0-9:]\{8\}\).*/\1/p' app.log

# Eliminar línies de DEBUG d'un log
sed '/\[DEBUG\]/d' app.log

# Extreure IPs d'un access.log
sed -n 's/^\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' access.log
```

### 10.7 Manipulació d'HTML/XML

```bash
# Eliminar tags HTML
sed 's/<[^>]*>//g' pagina.html

# Extreure contingut d'un tag específic
sed -n 's/.*<title>\(.*\)<\/title>.*/\1/p' pagina.html

# Afegir atribut a tots els <img>
sed 's/<img \([^>]*\)>/<img \1 loading="lazy">/' pagina.html
```

## 11. Exemples avançats

### Numerar línies d'un fitxer

```bash
sed = fitxer.txt | sed 'N;s/\n/\t/'
# Primera passada: = afegeix número de línia
# Segona passada: N uneix les dues línies amb un tab
```

### Eliminar línies duplicades consecutives

```bash
sed '$!N; /^\(.*\)\n\1$/!P; D' fitxer.txt
```

### Extreure bloc entre patrons (una sola vegada)

```bash
sed -n '/PATRÓ_INICI/{:a;N;/PATRÓ_FI/!ba;p}' fitxer.txt
```

### Invertir l'ordre de les paraules d'una línia

```bash
sed -E 's/([^ ]+) ([^ ]+)/\2 \1/g' fitxer.txt
```

### Afegir numeració de línia amb format

```bash
sed = fitxer.txt | sed 'N;s/\n/  /' | sed 's/^/  /' | sed 's/^ *\(.\{6,\}\)/\1/'
```

### Simular `head` i `tail`

```bash
# head -n 5
sed '6,$d' fitxer.txt
# o
sed '5q' fitxer.txt

# tail -n 3 (sense conèixer el nombre de línies)
sed -n -e :a -e '$p;N;6,$D;ba' fitxer.txt
```

### Substituir en múltiples fitxers recursivament

```bash
# Substitueix en tots els fitxers .conf del directori actual
find . -name "*.conf" -exec sed -i 's/vell/nou/g' {} \;

# O amb xargs
find . -name "*.conf" | xargs sed -i 's/vell/nou/g'
```

### Script sed en fitxer extern

```sed
#!/usr/bin/sed -f
# fitxer: neteja.sed
# Neteja un fitxer de text

# Elimina comentaris
/^[[:space:]]*#/d

# Elimina línies buides
/^[[:space:]]*$/d

# Elimina espais al final
s/[[:space:]]*$//

# Comprimeix espais múltiples
s/[[:space:]]\{2,\}/ /g
```

```bash
sed -f neteja.sed fitxer.txt
```

## 12. Diferències GNU sed vs. BSD sed

| Característica          | GNU sed (Linux)             | BSD sed (macOS)                  |
|-------------------------|-----------------------------|----------------------------------|
| `-i` in-place           | `sed -i 's/a/b/' f`         | `sed -i '' 's/a/b/' f`          |
| ERE                     | `-E` o `-r`                 | `-E`                             |
| `\n` en reemplaçament        | Funciona directament        | Cal usar `$'\n'` o un salt real  |
| `\w`, `\d`              | Suportats                   | No suportats (usar classes POSIX)|
| `\u`, `\l`, `\U`, `\L`  | Suportats (majús/minús)     | No suportats                     |
| `0~N` (step)            | Suportat                    | No suportat                      |
| `-s` (fitxers separats) | Suportat                    | No suportat                      |

### 12.1 Compatibilitat entre sistemes

```bash
# Portable (funciona a GNU i BSD):
sed 's/vell/nou/g' fitxer.txt

# GNU-only → equivalent portable:
sed -i 's/vell/nou/g' f         # GNU
sed -i '' 's/vell/nou/g' f      # BSD/macOS

# Inserir una nova línia en el reemplaçament (portable):
sed 's/patró/reemplaçament\'$'\n''continuació/' fitxer.txt
```

## 13. Bones pràctiques i consells

### 13.1 Provar abans de modificar

```bash
# Sempre prova sense -i primer
sed 's/vell/nou/g' fitxer.txt       # Comprova la sortida
sed -i.bak 's/vell/nou/g' fitxer.txt  # Després aplica amb còpia de seguretat
```

### 13.2 Usar delimitadors alternatius

Quan el patró conté `/`, és millor usar un altre delimitador:

```bash
# Amb / com a delimitador (cal escapar)
sed 's/\/usr\/local\/bin/\/usr\/bin/g' fitxer.txt

# Amb | com a delimitador (més llegible)
sed 's|/usr/local/bin|/usr/bin|g' fitxer.txt

# Amb @ o # (qualsevol caràcter no present al patró)
sed 's@/usr/local/bin@/usr/bin@g' fitxer.txt
```

### 13.3 Cometes i escapament a la shell

```bash
# Cometes simples: la shell no interpreta res
sed 's/\t/ /g' fitxer.txt

# Cometes dobles: la shell interpreta variables
TERME="hola"
sed "s/$TERME/adéu/g" fitxer.txt

# Combinar-les
sed "s/$TERME/"'adéu/g' fitxer.txt
```

### 13.4 Rendiment

```bash
# Processar fitxers grans: sed és molt eficient amb grans volums
wc -l gran_fitxer.txt                      # Veure la mida
sed -n '1000000,1000010p' gran_fitxer.txt  # Extreure ràpidament línies específiques

# Usar q per sortir aviat quan no cal processar la resta
sed '/PATRÓ/q' gran_fitxer.txt    # Atura en trobar el patró
```

### 13.5 Quan usar sed vs. altres eines

| Tasca                        | Eina recomanada    |
|------------------------------|--------------------|
| Substitució simple           | `sed`              |
| Selecció de camps/columnes   | `awk` o `cut`      |
| Substitució per caràcters    | `tr`               |
| Processament complex         | `awk` o `perl`     |
| Cerques simples              | `grep`             |
| Transformacions multilínia   | `awk` o `perl`     |
| Fitxers binaris              | `xxd` + `sed`      |

## 14. Referència ràpida

```bash
# Substitució
sed 's/PATRÓ/REEMPLAÇAMENT/'          # Primera ocurrència
sed 's/PATRÓ/REEMPLAÇAMENT/g'         # Totes les ocurrències
sed 's/PATRÓ/REEMPLAÇAMENT/2'         # Segona ocurrència
sed -i 's/PATRÓ/REEMPLAÇAMENT/g' f    # In-place

# Eliminació
sed '/PATRÓ/d'                   # Línies amb patró
sed 'N,Md'                       # Rang de línies
sed '/^$/d'                      # Línies buides

# Impressió selectiva
sed -n '/PATRÓ/p'                # Línies amb patró
sed -n 'N,Mp'                    # Rang de línies

# Inserció
sed '/PATRÓ/a\TEXT'              # Afegeix TEXT després
sed '/PATRÓ/i\TEXT'              # Insereix TEXT abans
sed '/PATRÓ/c\TEXT'              # Canvia la línia per TEXT

# Transliteració
sed 'y/abc/ABC/'                 # a→A, b→B, c→C

# Múltiples ordres
sed -e 'CMD1' -e 'CMD2'
sed 'CMD1; CMD2'
sed -f script.sed
```

#### Versions d'aquest document

+ HTML - [sed.html](https://proferamon.com/tic/sed.html)
+ PDF - [sed.pdf](https://proferamon.com/tic/docs/sed.pdf)
+ ODT - [sed.odt](https://proferamon.com/tic/odt/sed.odt)
+ MD - [sed.md](https://proferamon.com/tic/md/sed.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)


