sqlplusのすべてのタブを削除する

sqlplusのすべてのタブを削除する

この問題を解決できますが、なぜそのようなことが起こるのか理解できません。

私の使命は:(ksh)

  • ステップ1:sqlplusを使用してデータベースから数字を照会します。
  • ステップ2:電子メールのいくつかのテキスト形式を指定します。
  • ステップ3:これをEメールで送ってください。

これは私のコードの一部です。

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
}

この関数を呼び出すと、1234567という数字が表示されます。

PSNR=$(psnr)

私は電子メールに次の文を書いた。

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

この変数を使用したい場合メール管理契約tr -d '\040\011'trがなければ、結果は次のようになるため、stackexchangeで見つかったものを使用する必要がありました。

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

「\t」タブがわかりません。 sqlplusでは、このタブはどこから来ましたか?たぶんデータベースに固有ですか? (TOADを確認してみると、両方の列は数字(18)です。kshの関数に特別な機能があるのではないでしょうか?

答え1

また、他のデータベースを使用すると不要なスペースが発生しました。明らかに、SQLPlusなどのシェルスクリプトとツールを使用してデータベースからデータを抽出するのは間違っていますが、時には役に立つことがあります。

私の解決策は、結果から先行スペースと末尾のスペースを削除することでした。

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
}

文字列構文がkshサポートされていない場合は、簡単に置き換えることができます。$'...'

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

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

別の迅速で汚れた修正は、シェルを使用して不要なスペースを削除することです。psnr()代わりに、次のように機能を同じにしてください。

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

あなたは次のように書くでしょう:

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

答え2

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

指定されたスペースはタブ文字です。私のsqlplusクエリはspacecsv形式でのみ出力されるため、これを使用して不要なスペースを削除します。

 

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

関連情報