이것은 내가 얻는 오류입니다. 변수 값이 2여야 하기 때문에 실패합니다(이것을 얻기 위해 a를 사용했습니다 select * from tabel
). 해당 변수에 공백이 생겼습니다.
+ 0 !=
2
./setjobs[19]: 0: not found.
이 변수에서 공백이나 개행 문자를 모두 제거하려면 어떻게 해야 합니까? 알겠습니다 tr
,, sed
아니면 도움이 필요하신가요?
이것이 내가 하는 일이다:
set_jobs_count=$(echo "set heading off;
select count(*) from oppar_db
where ( oppar_db_job_name, oppar_db_job_rec ) in ($var) ;" | \
sqlplus -s ${OP_ORA_USER}/${OP_ORA_PASS}@$OPERATIONAL_DB_NAME)
이는 제안된 대로 작동합니다.
| sed 's/[[:space:]]//g'
하지만 여전히 다음과 같은 값을 얻습니다.
set_jobs_count=
2
답변1
출력에 줄바꿈이 남는 이유 sed 's/[[:space:]]//g'
는 데이터가 sed
한 번에 한 줄씩 렌더링되기 때문입니다. 따라서 교체는 데이터의 줄 바꿈을 대체할 수 없습니다( sed
전혀 표시되는 데이터의 일부 가 아닙니다 ).
대신에 다음을 사용할 수 있습니다.tr
tr -d '[:space:]'
이렇게 하면 공백 문자, 폼 피드, 줄 바꿈, 캐리지 리턴, 가로 탭 및 세로 탭이 제거됩니다.
답변2
ksh, bash 또는 zsh에서:
set_jobs_count=…
set_jobs_count=${set_jobs_count//[[:space:]]/}
Bourne과 같은 셸에서는 다음과 같이 선행 및 후행 공백을 제거하고 중간 공백을 모두 단일 공백으로 정규화할 수 있습니다.
set -f
set -- $set_jobs_count
set_jobs_count="$*"
set +f
set -f
와일드카드를 끄십시오. \[?*
데이터에 문자가 포함되어 있지 않은 경우 이를 생략할 수 있습니다.
$IFS
공백, 탭, 줄 바꿈의 기본값을 포함한다고 가정합니다 . 다른 공백 문자(CR, VT, FF...)는 변경되지 않습니다.
답변3
이미 제안한 대로 "tr -d '[:space:]'"를 사용하세요. 하지만 이 방법이 작동하지 않으면 아마도 이전 Unix 시스템에서는 다음 문자를 모두 덮어써야 합니다.
\011 HT '\t' (horizontal tab)
\012 LF '\n' (new line)
\013 VT '\v' (vertical tab)
\014 FF '\f' (form feed)
\015 CR '\r' (carriage ret)
\040 SPACE ' ' (space)
이것으로:
tr -d '\011\012\013\014\015\040'
그러나 출력을 혼동하는 다른 보이지 않는 문자가 있을 수 있으며 "select count(*) ..."의 결과는 정수여야 하므로 숫자만 남습니다.
tr -dc '0-9'
그러나 첫 번째 숫자 뒤에 다른 문자가 있고 그 뒤에 더 많은 숫자가 있는 경우에는 이 방법이 작동하지 않습니다. 따라서 발견된 첫 번째 숫자 시퀀스만 반환됩니다.
perl -ane '/\d+/ && print($&) && exit'
## example: will return '11', but raw output looks like '22 33'
(echo -e '\a11\b\b22 33') | perl -ane '/\d+/ && print($&) && exit'
답변4
더 쉬운 방법이 있습니다 - (모든) 쉘을 사용하십시오분사.
다음과 같은 스크립트를 작성해 보겠습니다.
#!/bin/bash
readonly CONN="${RDS_ADMIN}@//${RDS_HOST}/${RDS_DBNAME}"
SCN=$(sqlplus -S $CONN << EOF
SET HEADING OFF
SELECT CURRENT_SCN FROM V\$DATABASE;
EOF
)
echo ">>>$SCN<<<"
SCN=$(echo $SCN)
echo ">>>$SCN<<<"
다음은 스크립트의 출력입니다.
oracle@ctrl-dev|265$ ./t.sh
>>>
87401840<<<
>>>87401840<<<
oracle@ctrl-dev|266$
외부 명령이 필요하지 않습니다. 단점은 VAR=$(echo $VAR)
구조가 그다지 좋아 보이지 않는다는 것입니다.