sqlplus의 모든 탭 삭제

sqlplus의 모든 탭 삭제

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

내 임무는: (ksh)

  • 1단계: sqlplus를 사용하여 데이터베이스에서 숫자를 쿼리합니다.
  • 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

이 변수를 사용하고 싶다면메일 관리 계약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

관련 정보