GNU/Linux >> Tutoriales Linux >  >> Linux

Lum:¿cómo formatear la salida Sed como la impresión formateada de Printf?

¿Puede sed reemplazar el texto con una cadena formateada como la impresión formateada de printf?

El siguiente comando sed reemplaza una línea que comienza con el valor actual de “$domain” con varios valores especificados en las variables.

/bin/sed  "s/\(^${domain} *${limittype} * ${limititem}.*\)/$EXPL#\1\n${domain} ${limittype} ${limititem} ${value}/" /etc/security/limits.conf

Sin embargo, la salida no se alineará correctamente porque la longitud de los valores de dominio, etc. no es la misma.

Entonces la salida sería algo así como

#oracle   hard   nproc    131072
oracle   hard   nproc    666

Si bien es válido, es difícil de leer. Preferiría obtener algo como

#oracle   hard   nproc    131072
oracle   hard   nproc    666

Lo mejor que puedo hacer para obtener el resultado deseado es:

/bin/sed  "s/\(^${domain}\)\( *\)\(${limittype}\)\( *\)\(${limititem}\)\( *\)\(.*\)/$EXPL#\1\2\3\4\5\6\7\n${domain}\2${limittype}\4${limititem}\6${value}/" /etc/security/limits.conf

Pero creo que debe haber una forma más elegante de hacerlo.

El documento sed one liners contiene algunos ejemplos que usan un número específico de caracteres, por ejemplo,

sed -e :a -e 's/^.\{1,78\}$/ &/;ta'  # set at 78 plus 1 space

Pero esto está en el regexp sección no en el replacement sección.

Respuesta aceptada:

Esto usa la sintaxis extendida de expresiones regulares -r , que aclara gran parte del desorden. Además, debido a que ya conoce algunos de los valores de los campos, en realidad no necesita volver a hacer referencia a ellos, lo que nuevamente reduce el desorden (y la sobrecarga).

& es un valor de reemplazo especial:contiene todo el patrón coincidente. Usando el & , nuevamente reduce el desorden. Como no es una referencia inversa, tiene una sobrecarga significativamente menor.

He usado ( +) contra ( *) . El + asume que hay al menos un espacio entre los campos de entrada. Simplemente cámbielo a * eso no es el caso.

EXPL=
dom=oracle
typ=hard
itm=nproc
val=666

echo "oracle   hard   nproc    131072" |
  sed -r "s/^$dom( +)$typ( +)$itm( +).*/$EXPL#&\n$dom\1$typ\2$itm\3$val/" 

salida

#oracle   hard   nproc    131072
oracle   hard   nproc    666

Linux
  1. Cómo asignar la salida de un comando de Linux a una variable

  2. ¿Cómo reemplazar una cadena en un archivo (s)?

  3. ¿Cómo crear una salida virtual en Pulseaudio?

  4. Bash Script:¿Cómo asignar cada línea de salida de comando a valores en una matriz?

  5. tcpdump:¿cómo obtener una salida grepable?

Cómo reemplazar un disco duro en Linux

Cómo clonar una partición o disco duro en Linux

CÓMO UTILIZAR EL EDITOR SED

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

Cómo grep salida ps con encabezados

¿Cómo detener la salida de ping?