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.
sed segueix un cicle de processament per a cada línia:
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]| 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...)| 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)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 1as — 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úsculesGrups 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àtorsd — 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íniesp — 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íniaq 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 3i — 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.txtc — 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.txty — 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íniaImprimeix 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íniesr i w — Lectura i escriptura de fitxerssed '/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 fitxern 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 unal — Mostrar
caràcters no imprimiblessed -n 'l' fitxer.txt # Mostra caràcters de control, tabs, etc.Per defecte, sed usa BRE (Basic Regular
Expressions). Amb -E s’activen ERE
(Extended Regular Expressions).
| 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 |
-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 |
| 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 blancs| 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!)| 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) |
-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ó:
-isense còpia de seguretat és irreversible. Sempre prova sense-iprimer.
sed té dos buffers interns:
| 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.txtDiverses 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{}Agrupen ordres que s’apliquen a la mateixa adreça:
sed '/patró/{
s/foo/bar/g
s/baz/qux/g
p
}' fitxer.txt| 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# 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# 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# 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# 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# 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# 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# 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.htmlsed = 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 tabsed '$!N; /^\(.*\)\n\1$/!P; D' fitxer.txtsed -n '/PATRÓ_INICI/{:a;N;/PATRÓ_FI/!ba;p}' fitxer.txtsed -E 's/([^ ]+) ([^ ]+)/\2 \1/g' fitxer.txtsed = fitxer.txt | sed 'N;s/\n/ /' | sed 's/^/ /' | sed 's/^ *\(.\{6,\}\)/\1/'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# 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'#!/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,\}/ /gsed -f neteja.sed fitxer.txt| 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 |
# 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# 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 seguretatQuan 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# 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# 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ó| 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 |
# 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