eliminando todas las pestañas en sqlplus

eliminando todas las pestañas en sqlplus

Puedo resolver este problema, pero no entiendo por qué sucede.

Mi tarea es: (en ksh)

  • 1er paso: Consultar un número desde una BD con sqlplus,
  • 2do paso: Formatear algún texto para un correo,
  • 3er paso: envía un correo con estos.

Esta es una parte de mi código:

psnr() {
sqlplus -s USR/PASS@PROD << EOS
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
  select max_number-last_number from postalslip
  where state = 'OPEN'
/
exit
/
EOS
}

Obtuve un número, 1234567, cuando llamé a esta función.

PSNR=$(psnr)

Escribo una palabra para un correo:

echo "Today's result is: $PSNR" > $MAILTMP

si quiero usar esta variableCORREODebo usar tr -d '\040\011'lo que encontré aquí, en stackexchange, porque el resultado sin tr será este:

od -c mailtmp.17872.txt
0000000   T   o   d   a   y   '   s       r   e   s   u   l   t       i
0000020   s   :      \t                               1   2   3   4   5
0000040   6   7  \n
0000043

Esa pestaña '\t' es la que no entiendo: ¿de dónde viene, de sqlplus? ¿Posiblemente especificidad de DB? (Revisé TOAD, ambas columnas son el número (18). ¿Quizás la función en ksh tenga algunas características especiales?

Respuesta1

También me encontré con este espacio en blanco no deseado cuando trabajaba con una base de datos diferente. Claramente, los scripts de shell y herramientas como SQLPlus no son adecuados para extraer datos de bases de datos, pero hay ocasiones en las que es conveniente.

Mi solución es eliminar los espacios en blanco iniciales y finales del resultado:

psnr() {
  sqlplus -s USR/PASS@PROD << 'EOS' | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//'
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
 select max_number-last_number from postalslip
 where state = 'OPEN'
/
exit
/
EOS
}

Si kshno admite la $'...'sintaxis de cadena, es bastante fácil reemplazarla:

# Original style
sed $'s/^[ \t]*//'

# Alternative style
T=$(printf "\t")
...
sed "s/^[ $T]*//"

Una solución alternativa rápida y sucia es utilizar el shell para eliminar los espacios en blanco no deseados. Dejando tu psnr()función sin cambios, en lugar de esto:

echo "Today's result is: $PSNR" > $MAILTMP

escribirías esto:

echo "Today's result is:" $PSNR > $MAILTMP

Respuesta2

sqlplus <<'EOF' | perl -pe 's/\t//g'
Some queries here
EOF

Este es el espacio proporcionado en la pestaña. Mis consultas sqlplus salen solo spacey en formato csv, así que lo uso para eliminar espacio no deseado

 

echo 'foo bar       ,baz      ,foobar   ' | perl -pe 's/ +,/,/g ; s/ +$//g'
foo bar,baz,foobar

información relacionada