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

2. Sintaxi general

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:

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

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
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)
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ó:

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.

s/REGEXP/REEMPLAÇAMENT/[FLAGS]
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):

# \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ó.

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.

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)

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.

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.

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.

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

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.

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

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

# 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

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

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:

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

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

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

# 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

# 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

# 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

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

# 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

# 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

# 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

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

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

Extreure bloc entre patrons (una sola vegada)

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

Invertir l’ordre de les paraules d’una línia

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

Afegir numeració de línia amb format

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

Simular head i tail

# 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

# 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

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

# 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

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

# 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

# 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

# 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

# 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

Domini Públic (CC0)