이 문제를 해결할 수는 있지만 왜 그런 일이 발생하는지 이해할 수 없습니다.
내 임무는: (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 쿼리는 space
csv 형식으로 출력되므로 이를 사용하여 원하지 않는 공간을 제거합니다.
echo 'foo bar ,baz ,foobar ' | perl -pe 's/ +,/,/g ; s/ +$//g'
foo bar,baz,foobar