¿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