Este artículo es parte de la serie en curso Consejos y trucos de Unix Sed.
En nuestros artículos anteriores de sed, aprendimos:impresión de sed, eliminación de sed, sustitución de sed, escritura de archivos de sed y comandos múltiples de sed.
En este artículo, revisemos algunas soluciones interesantes con el comando de sustitución "s" en sed con varios ejemplos prácticos.
Yo. Delimitador de sustitución de Sed
Como comentamos en nuestra publicación anterior, podemos usar los diferentes delimitadores como @% |; :en el comando de sustitución sed.
Primero creemos el archivo path.txt que se usará en todos los ejemplos mencionados a continuación.
$ cat path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Ejemplo 1:sed @ delimitador:Sustituya /opt/omni/lbin por /opt/tools/bin
Cuando sustituye un nombre de ruta que tiene '/', puede usar @ como delimitador en lugar de '/'. En el siguiente ejemplo sed, en la última línea del archivo de entrada, /opt/omni/lbin se cambió a /opt/tools/bin.
$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
Ejemplo 2:sed / delimitador:sustituya /opt/omni/lbin por /opt/tools/bin
Cuando deba usar '/' en la sustitución relacionada con el nombre de la ruta, debe escapar '/' en los datos de sustitución como se muestra a continuación. En este ejemplo sed, el delimitador '/' se escapó en la parte REGEXP y REPLACEMENT.
$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
II. Sed '&' Obtener cadena coincidente
La parte precisa de una línea de entrada en la que coincide la expresión regular está representada por &, que luego se puede usar en la parte de reemplazo.
Ejemplo 1:sed y uso:sustituya /usr/bin/ por /usr/bin/local
$ sed 's@/usr/bin@&/local@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
En el ejemplo anterior, '&' en la pieza de reemplazo se reemplazará con /usr/bin, que coincide con el patrón, y se agregará con /local. Entonces, en la salida, todas las ocurrencias de /usr/bin se reemplazarán con /usr/bin/local
Ejemplo 2:sed y uso:hacer coincidir toda la línea
&reemplaza lo que coincida con el REGEXP dado.
$ sed 's@^.*$@<<<&>>>@g' path.txt <<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>> <<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>> <<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>
En el ejemplo anterior, la expresión regular tiene "^.*$" que coincide con toda la línea. La pieza de repuesto <<<&>>> escribe toda la línea con <<
III. Agrupación y referencias inversas en Sed
La agrupación se puede usar en sed como una expresión regular normal. Un grupo se abre con "\(" y se cierra con "\)". La agrupación se puede usar en combinación con referencias inversas.
La referencia inversa es la reutilización de una parte de una expresión regular seleccionada por agrupación. Las referencias inversas en sed se pueden usar tanto en una expresión regular como en la parte de reemplazo del comando sustituto.
Ejemplo 1:Obtén solo la primera ruta en cada línea
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
En el ejemplo anterior, \(\/[^:]*\) coincide con la ruta disponible antes de que llegue el primero :. \1 reemplaza al primer grupo coincidente.
Ejemplo 2:Multiagrupación
En el archivo ruta.txt cambie el orden de los campos en la última línea del archivo.
$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin: /root/bin:/opt/omni/sbin:/opt/omni/lbin
En el comando anterior, $ especifica que la sustitución ocurra solo para la última línea. La salida muestra que el orden de los valores de la ruta en la última línea se ha invertido.
Ejemplo 3:obtener la lista de nombres de usuario en el archivo /etc/passwd
Este ejemplo de sed muestra solo el primer campo del archivo /etc/passwd.
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
Ejemplo 4:poner entre paréntesis el primer carácter de cada palabra
Este ejemplo sed imprime el primer carácter de cada palabra entre paréntesis.
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
Ejemplo 5:Comuníquese el número simple.
Vamos a crear un archivo llamado números que tiene una lista de números. El siguiente ejemplo de comando sed se usa para confirmar los números hasta miles.
$ cat numbers 1234 12121 3434 123 $sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers 1,234 12,121 3,434 123