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 porLa
hasta la línea 4/^La/, /fin\.$/
desde la línea que empieza porLa
a la que termina enfin.
- ¡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