Entfernen aller Tabs in SQLPlus

Entfernen aller Tabs in SQLPlus

Ich kann dieses Problem lösen, aber ich verstehe nicht, warum es auftritt.

Meine Aufgabe ist: (in ksh)

  • 1. Schritt: Abfrage einer Zahl aus einer Datenbank mit sqlplus,
  • 2. Schritt: Formatieren Sie einen Text für eine E-Mail,
  • 3. Schritt: Senden Sie eine E-Mail mit diesen.

Dies ist ein Teil meines Codes:

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
}

Ich erhalte die Nummer 1234567, wenn ich diese Funktion aufrufe.

PSNR=$(psnr)

Ich schreibe ein Wort für eine Mail:

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

wenn ich diese Variable verwenden möchteMAILTMPIch muss verwenden, tr -d '\040\011'was ich hier bei Stackexchange gefunden habe, denn ohne tr wäre das Ergebnis folgendes:

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

Was ich nicht verstehe, ist der Tabulator „\t“: Woher kommt er, von SQLPlus? Vielleicht DB-spezifisch? (Ich habe in TOAD nachgeschaut, beide Spalten sind Nummern (18). Vielleicht hat die Funktion in KSH einige spezielle Features?

Antwort1

Ich bin auch schon auf diese unerwünschten Leerzeichen gestoßen, als ich mit einer anderen Datenbank gearbeitet habe. Shell-Skripte und Tools wie SQLPlus sind eindeutig nicht das Richtige, um Daten aus Datenbanken zu extrahieren, aber es gibt Situationen, in denen es praktisch ist.

Meine Lösung besteht darin, führende und nachfolgende Leerzeichen aus dem Ergebnis zu entfernen:

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
}

Wenn die Zeichenfolgensyntax kshnicht unterstützt wird, lässt sie sich ganz einfach ersetzen:$'...'

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

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

Eine alternative schnelle und einfache Lösung besteht darin, die Shell zu verwenden, um unerwünschte Leerzeichen zu entfernen. Lassen Sie Ihre psnr()Funktion unverändert, anstatt Folgendes zu tun:

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

Sie würden Folgendes schreiben:

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

Antwort2

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

Dies ist der bereitgestellte Platzhalter. Meine SQLPlus-Abfragen geben nur spaceund im CSV-Format aus, daher verwende ich dies, um unerwünschten Platz zu entfernen

 

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

verwandte Informationen