sed

stream editor - modifica el input línea por línea, lo modifica y lo devuelve, normalmente a stdout.

La sintaxis de sed es rango/patrón/acción. El rango y los patrones se definen utilizando expresiones regulares.

Opciones Descripción
d delete borra la selección
-E utiliza regex
-f file patrones de sustitución en cada línea
g aplica los cambios a todas las instancias en una línea, no solo a la primera
-i in place - realiza la sustitución dentro del archivo (pero permite un sufijo, -i.sufijo)
-n silencia el input original
p print imprime la selección
s/pattern1/pattern2/ substitute - patrón 1 por patrón 2

La opcíon -f file.sed permite escribir patrones en un archivo que procesado por sed. Las órdenes no requiere comillas:

process.sed

s/^#[a-zA-Z0-9\ :@#,.]*//
s/---//
s/^\*/> /g
s/\*$//
/^$/d
s/^/- /

Ejemplos

file.txt

esto no es esto,
pero esto es aquello
y aquello no es lo otro

Imprimir y borrar p

sed '/pero/p' file.txt 
# esto no es esto,
# pero esto es aquello
# pero esto es aquello
# y aquello no es lo otro

Elimina la impresión del input e imprime las líneas que contienen el patrón:

sed -n '/pero/ p' file.txt 
# pero esto es aquello

o las líneas que no contienen el patrón:

sed -n '/pero/! p' file.txt 
# esto no es esto,
# y aquello no es lo otro

es equivalente a borrar con d:

sed '/pero/ d' file.txt 
# esto no es esto,
# y aquello no es lo otro

Imprimiendo por número de línea:

sed -n 2p file.txt 
# pero esto es aquello
sed -n 2,3p file.txt 
# pero esto es aquello
# y aquello no es lo otro
sed -n '/esto/ p' file.txt 
# esto no es esto,
# pero esto es aquello

Utiliza regex para seleccionar las líneas que empiezan por el patrón:

sed -n '/^esto/ p' file.txt 
# esto no es esto,

Sustituciones s

sed 's/esto/estotro/' file.txt 
# estotro no es esto,
# pero estotro es aquello
# y aquello no es lo otro

g sustituye todas las instancias del término a sustituir:

sed 's/esto/estotro/g' file.txt 
# estotro no es estotro,
# pero estotro es aquello
# y aquello no es lo otro

-n y p permite imprimir solamente las líneas modificadas:

sed -n 's/esto/estotro/pg' file.txt 
# estotro no es estotro,
# pero estotro es aquello

Se pueden seleccionar las líneas en base a patrones:

sed -n '/^pero/ s/esto/estotro/p' file.txt 
# pero estotro es aquello

In-place replacement

La opción -i (in-place) sirve para modificar el archivo en lugar de pasarlo únicamente a stdout. También se puede copiar a un nuevo archivo especificando un sufijo:

sed -i.ello `s/esto/ello/g` file.txt
# crea un nuevo archivo 'file.txt.ello'

Números de líneas y rangos

Las líneas se puede especificar por número o por patrón;

  • 1,4 de la línea 1 a la línea 4
  • /^La/, 4 desde la línea que empieza por La hasta la línea 4
  • /^La/, /fin\.$/ desde la línea que empieza por La a la que termina en fin. - ¡ojo con el punto, hay que escaparlos!

Referenciar con &

Se utiliza & para referirse al patrón introducido en la primera parte de la ecuación.

cat tel.txt
# 914749668
# 914881250
# 925889120

sed 's/^[[:digit:]][[:digit:]]/(&)/g' tel.txt
# (91)4749668
# (91)4881250
# (92)5889120

sed 's/[8]/(&)/g' tel.txt
# 91474966(8)
# 914(8)(8)1250
# 925(8)(8)9120
echo "And this and that." | sed 's/th/fudge &/g'
# And fudge this and fudge that.

Extended regex - -E

La opción -E permite utilizar regex expandido; hay algunas particularidades con +, ? y alguna otra cosa, pero sobre todo permite recoger un patrón entre paréntesis y referenciarlo con \n en función de su posición:

$ echo "cerdo" | sed -E 's/([abcde]*)([a-z])([a-z]*)/\1XXX\3/g'
ceXXXdo

Para añadir líneas nuevas en sed, la forma más fácil es escapar una línea literal:

test.sh

#!/usr/bin/env bash

echo "holaholahola | sed 's/hola/hola\
/g'

$ ./test.sh
hola
hola
hola

Ver más aquí - original.