Removendo todos os espaços, guias, novas linhas, etc. de uma variável?

25

Este é o erro que estou recebendo e está falhando devido a uma variável cujo valor deveria ser 2 (estou obtendo isso usando a select * from tabel). Estou recebendo espaços nessa variável.

+ 0 != 
         2
./setjobs[19]: 0:  not found.

Como removo todos esses espaços ou uma nova linha dessa variável? Pode tr, sedou qualquer coisa ajudar?

Isto é o que estou fazendo:

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)

Isso funciona como sugerido:

| sed 's/[[:space:]]//g'

Mas ainda obtenho um valor como:

  set_jobs_count=
  2
munish
fonte
11
Você pode converter uma string em um int na instrução select. Como isso é feito depende do banco de dados, Sybase, Oracle, MySQL, etc.
BSD
11
como faço para fazer isso, eu tenho o Oracle 9i
Munish
11
usando sed é | sed 's/[[:space:]]//g'o colapso de espaço em branco
BSD
graças funciona até certo ponto, mas ainda os valores da variável vem comoset_jobs_count= 2
Munish
Dependendo do shell, você poderá fazê-lo sem nenhuma ferramenta externa. Veja stackoverflow.com/a/3352015/587717
Edd Steel

Respostas:

38

Você pode usar tr, como em tr -d '\040\011\012\015', o que removerá espaços, guias, retornos de carro e novas linhas.

Kyle Jones
fonte
3
Existe uma vantagem em usar \040\011\012\015mais [:space:]?
Nick
A portabilidade com versões UNIX muito antigas é a única razão pela qual consigo pensar --- idade suficiente para que a versão UNIX anteceda o POSIX.1 .
Kyle Jones
11
O que há com o %caractere no final da saída? Acho que é algum tipo de maneira do Linux de me dizer que a saída pára por aí?
Atripes #
4

Em ksh, bash ou zsh:

set_jobs_count=…
set_jobs_count=${set_jobs_count//[[:space:]]/}

Em qualquer shell, você pode remover os espaços em branco iniciais e finais e normalizar todos os espaços em branco intermediários em um único espaço como este:

set +f
set -- $set_jobs_count
set_jobs_count=$*
set -f

set +fdesliga o brilho; se você souber que os dados não contêm nenhum dos caracteres \[?*, você pode omiti-lo.

Gilles 'SO- parar de ser mau'
fonte
resposta interessante +1
munish
@BinaryZebra O globbing acontece em set -- $set_jobs_count. set_jobs_count=$*é equivalente a set_jobs_count="$@"since $*e $@é apenas equivalente quando não está entre aspas e o lado direito de uma atribuição é analisado da mesma maneira que uma string com aspas duplas.
Gilles 'SO- stop be evil'