sqlplus의 모든 탭 제거

sqlplus의 모든 탭 제거

이 문제를 해결할 수는 있지만 왜 그런 일이 발생하는지 이해할 수 없습니다.

내 임무는: (ksh)

  • 1단계: sqlplus를 사용하여 DB에서 숫자를 쿼리합니다.
  • 2단계: 메일의 일부 텍스트 서식을 지정하고,
  • 3단계: 이것을 메일로 보내세요.

이것은 내 코드의 일부입니다.

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

이 변수를 사용하고 싶다면메일TMPtr -d '\040\011'여기 stackexchange에서 찾은 것을 사용해야 합니다 . 왜냐하면 tr이 없는 결과는 다음과 같기 때문입니다.

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에서 나온 탭인가요? 아마도 DB 특이성일까요? (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

관련 정보