# Referência Rápida de sed

*Edição de fluxo, substituição, endereços, espaço de retenção, transformações no local*

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

## Básico

### Executando o sed

```
sed 's/old/new/' file.txt          # substitui primeira ocorrência por linha
sed 's/old/new/g' file.txt         # substitui todas as ocorrências por linha
sed -n '5p' file.txt               # imprime apenas a linha 5
sed '3d' file.txt                  # apaga a linha 3
echo "hello" | sed 's/hello/hi/'   # entrada via pipe
```

### Opções de Linha de Comando

| Command | Description |
|---------|-------------|
| `-n` | Suprime impressão automática; imprime apenas com `p` |
| `-e 'cmd'` | Executa um comando sed (encadeie vários com `-e`) |
| `-f script.sed` | Lê comandos de um arquivo |
| `-i[sufixo]` | Edita o arquivo no local (sufixo de backup opcional) |
| `-E / -r` | Usa expressões regulares estendidas |

## Substituição

### Sintaxe de Substituição

```
sed 's/foo/bar/' f                 # primeira ocorrência por linha
sed 's/foo/bar/g' f                # todas as ocorrências
sed 's/foo/bar/3' f                # apenas a 3ª ocorrência
sed 's/foo/bar/gi' f               # todas, sem distinção de maiúsculas
sed 's|/usr/bin|/opt/bin|g' f      # delimitador alternativo
```

### Flags de Substituição

| Command | Description |
|---------|-------------|
| `g` | Substitui todas as ocorrências na linha |
| `N (número)` | Substitui apenas a N-ésima ocorrência |
| `p` | Imprime a linha se a substituição foi feita |
| `w arquivo` | Grava linhas substituídas em arquivo |
| `i / I` | Correspondência sem distinção de maiúsculas (GNU) |

## Endereços

### Exemplos de Endereços

```
sed '3s/a/b/' f                    # apenas na linha 3
sed '2,5s/a/b/' f                  # linhas 2 a 5
sed '/^#/d' f                      # apaga linhas que começam com #
sed '/start/,/end/d' f             # apaga intervalo entre padrões
sed '1~2d' f                       # apaga linhas ímpares (GNU)
```

### Tipos de Endereço

| Command | Description |
|---------|-------------|
| `N` | Linha de número N |
| `$` | Última linha |
| `N,M` | Intervalo de linhas de N a M |
| `/regex/` | Linhas que correspondem ao regex |
| `/regex1/,/regex2/` | Intervalo do primeiro ao segundo padrão |
| `N~passo` | A partir de N, a cada N-ésima linha (GNU) |
| `end!` | Negação — aplica a linhas que não correspondem |

## Apagar e Imprimir

### Comandos de Apagar e Imprimir

```
sed '5d' f                         # apaga a linha 5
sed '/^$/d' f                      # apaga linhas em branco
sed -n '10,20p' f                  # imprime linhas 10–20
sed -n '/error/p' f                # imprime linhas que correspondem ao padrão
sed '/debug/!d' f                  # mantém apenas linhas correspondentes
```

### Referência de Comandos

| Command | Description |
|---------|-------------|
| `d` | Apaga o espaço de padrão, inicia próximo ciclo |
| `D` | Apaga até a primeira nova linha no espaço de padrão |
| `p` | Imprime o espaço de padrão |
| `P` | Imprime até a primeira nova linha no espaço de padrão |
| `q` | Sai após imprimir o espaço de padrão atual |
| `Q` | Sai sem imprimir (GNU) |

## Inserir e Acrescentar

### Inserir, Acrescentar, Alterar

```
sed '3i\linha inserida' f          # insere antes da linha 3
sed '3a\linha acrescentada' f      # acrescenta após a linha 3
sed '3c\linha substituída' f       # substitui a linha 3
sed '/marcador/a\nova linha' f     # acrescenta após correspondência
```

### Comandos

| Command | Description |
|---------|-------------|
| `i\texto` | Insere texto antes da linha atual |
| `a\texto` | Acrescenta texto após a linha atual |
| `c\texto` | Substitui a linha atual pelo texto |
| `r arquivo` | Lê e acrescenta conteúdo do arquivo |
| `R arquivo` | Lê e acrescenta uma linha do arquivo (GNU) |
| `w arquivo` | Grava o espaço de padrão no arquivo |

## Espaço de Retenção

### Comandos do Espaço de Retenção

| Command | Description |
|---------|-------------|
| `h` | Copia espaço de padrão para o de retenção |
| `H` | Acrescenta espaço de padrão ao de retenção |
| `g` | Copia espaço de retenção para o de padrão |
| `G` | Acrescenta espaço de retenção ao de padrão |
| `x` | Troca espaços de padrão e retenção |

### Exemplos do Espaço de Retenção

```
sed -n '1!G;h;$p' f               # inverte linhas (tac)
sed '/^$/{ x; s/\n//; x; }' f     # colapsa retenção em branco
sed -n 'H;${x;s/\n/ /g;p;}' f     # junta todas as linhas com espaço
```

## Múltiplos Comandos

### Encadeando Comandos

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

### Agrupamento e Ramificação

| Command | Description |
|---------|-------------|
| `{ cmd1; cmd2; }` | Agrupa comandos para o mesmo endereço |
| `:rótulo` | Define um rótulo de ramificação |
| `b rótulo` | Ramifica (salta) para o rótulo |
| `t rótulo` | Ramifica se o último `s///` teve sucesso |
| `T rótulo` | Ramifica se o último `s///` falhou (GNU) |

## Edição no Local

### Exemplos de Edição no Local

```
sed -i 's/old/new/g' file.txt            # edita no local (GNU)
sed -i.bak 's/old/new/g' file.txt        # backup como file.txt.bak
sed -i '' 's/old/new/g' file.txt         # no local no macOS (sem backup)
sed -i '/^#/d' config.txt                # remove comentários no local
```

### Notas de Plataforma

| Command | Description |
|---------|-------------|
| `GNU sed -i` | Sufixo é opcional; `-i` sozinho edita sem backup |
| `BSD/macOS sed -i` | Exige argumento de sufixo; use `-i ''` sem backup |
| `-i.bak` | Cria arquivo de backup com extensão `.bak` |
| `Múltiplos arquivos` | `sed -i 's/a/b/g' *.txt` edita todos os arquivos correspondentes |

## Regex

### Regex no sed

| Command | Description |
|---------|-------------|
| `.` | Qualquer caractere único |
| `*` | Zero ou mais do anterior |
| `\+` | Um ou mais (BRE) — `+` em ERE |
| `\?` | Zero ou um (BRE) — `?` em ERE |
| `^` | Início da linha |
| `$` | Fim da linha |
| `[abc]` | Classe de caracteres |
| `\( \)` | Grupo de captura (BRE) — `()` em ERE |
| `\1, \2` | Referência retroativa ao grupo de captura |
| `&` | String inteira correspondida (na substituição) |

### Exemplos de Regex

```
sed 's/[0-9]\+/NUM/g' f               # substitui números
sed -E 's/(foo)(bar)/\2\1/g' f         # troca grupos (ERE)
sed 's/.*/(&)/' f                      # envolve linha em parênteses
sed 's/[ \t]*$//' f                    # remove espaços finais
```

## Padrões Comuns

### One-Liners

```
sed -n '1p' f                          # primeira linha (head -1)
sed '$!d' f                            # última linha (tail -1)
sed '/^$/d' f                          # remove linhas em branco
sed 's/^[ \t]*//' f                    # remove espaços iniciais
sed '=' f | sed 'N;s/\n/\t/' f         # numera linhas
```

### Receitas

| Command | Description |
|---------|-------------|
| `Duplo espaço` | `sed G` — acrescenta linha em branco após cada linha |
| `Remover tags HTML` | `sed 's/<[^>]*>//g'` |
| `Extrair e-mails` | `sed -nE 's/.*([a-z]+@[a-z.]+).*/\1/p'` |
| `Comentar linhas` | `sed 's/^/# /'` — prefixa cada linha com `# ` |
| `Remover linhas em branco no final` | `sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'` |
| `Substituir N-ésima linha` | `sed 'Nc\novo texto'` — substitui a linha N |
