sed

Expresiones regulares en sed: para usarlos como metacaracteres, hay que “escapar” +, (, ), ?

“ak* \+xx\?” -> “akkk xx3”

Sustitución reutilizando el patron

# Caso sencillo: 1 solo patron. Se puede usar &:
# Añadir parantesis a cada secuencia de numeros
sed 's/[0-9]*/(&)/'

# Para varios patrones, se marcan los patrones a reutilizar con parentesis,
# y se utiliza \1, \2 para referenciar cada patron encontrado:
# Intercambiar el primer campo con el segundo. Por ejemplo, Type: abc-123 se convierte en Type: 123-abc
sed 's/Type: \([a-z]*\)-\([0-9]*\)/Type: \2 \1/'
# Elimina el path de una url, dejando solo hasta el hostname
sed "s_\(http://[a-z0-9A-Z.\-]*/\)\(.*\)_\1_"

Extraer cadenas de una linea

Con egrep (grep -E) se puede imprimir la parte de una linea que coincida con un patron.

Por ejemplo, para extraer las temperaturas de una linea…

echo "Temp1: 37.2 C Temp2: 40.0 C" | grep -Eo '[0-9\.]+[[:punct:]]?[ ]?[CF]+'

Inserción de texto

# Añadir texto al final de una linea
sed '/^wheel/ s_$_,newWheelUser_' /etc/group

Con i inserta un texto antes de la linea actual, con a despues. En ambos casos introduce un salto de linea. Por eso, para que inserte en la misma linea hay que recurrir a la sustitucion:

> sed iabcd
  fge
  abcd
  fge
> sed aabcd
  geg
  geg
  abcd
> sed s/^/abcd/g
   geg
   abcdgeg

# Añadir una linea al final de varios ficheros de texto
sed -i '$aexit 0' *
# Añadirla al principio (con salto de línea 😉
sed -i '1i. /home/group-bashrc\n' /home/*/.bashrc

Para ejecutar varios comandos sed en una línea, separar con “;”

sed "s/NODE/$NODE/g;s/IP/$IP/g" < $TEMPLATE

UNIX Stream EDitor (sed) Cheat Sheet

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *