GNU/Linux >> Tutoriales Linux >  >> Linux

Tutorial de Unix Sed:ejemplos avanzados de sustitución de Sed

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 <<>> al principio y al final de la línea respectivamente.

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

Linux
  1. Tutorial de Unix Sed:cómo ejecutar múltiples comandos Sed

  2. UNIX/Linux:10 ejemplos de comandos de Netstat

  3. 10 ejemplos de comandos Xargs en Linux / UNIX

  4. Ejemplos de comandos sed en Linux

  5. Sustitución de variables de entorno en sed

Tutorial de Unix Sed:Cómo escribir en un archivo usando Sed

Tutorial de Unix Sed:anexar, insertar, reemplazar y contar líneas de archivos

Tutorial de Unix Sed:6 ejemplos para la operación de bifurcación de Sed

Tutorial de Unix Sed:7 ejemplos de operaciones Sed Hold y Pattern Buffer

Tutorial de ping:15 ejemplos efectivos de comandos ping

Tutorial de Unix Sed:operación de archivos de varias líneas con 6 ejemplos prácticos