¿Eliminar todos los espacios, pestañas, líneas nuevas, etc. de una variable?

25

Este es el error que obtengo y falla debido a una variable cuyo valor se supone que es 2 (obtengo esto usando a select * from tabel). Estoy obteniendo espacios en esa variable.

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

¿Cómo elimino todos esos espacios o una nueva línea de esa variable? ¿Puede tr, sedo algo ayudar?

Esto es lo que estoy haciendo:

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)

Esto funciona como se sugiere:

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

Pero todavía obtengo un valor como:

  set_jobs_count=
  2
munish
fuente
1
Puede convertir una cadena a un int en la instrucción select. ¿Cómo que se hace depende de la base de datos, Sybase, Oracle, MySQL, etc.
BSD
1
cómo hago eso, tengo
Oracle
1
usando sed es | sed 's/[[:space:]]//g'colapsar espacios en blanco
bsd
gracias funciona hasta cierto punto, pero aún así los valores de la variable son comoset_jobs_count= 2
munish
Dependiendo del shell, puede hacerlo sin ninguna herramienta externa. Ver stackoverflow.com/a/3352015/587717
Edd Steel

Respuestas:

38

Puede usar tr, como en tr -d '\040\011\012\015', que eliminará espacios, pestañas, retornos de carro y líneas nuevas.

Kyle Jones
fuente
3
¿Hay alguna ventaja de usar \040\011\012\015más [:space:]?
Nick
La portabilidad con versiones muy antiguas de UNIX es la única razón por la que puedo pensar, lo suficientemente antigua como para que la versión UNIX sea anterior a POSIX.1 .
Kyle Jones
1
¿Qué pasa con el %personaje al final de la salida? Supongo que es una forma de Linux de decirme que la salida se detiene allí.
atripes
4

En ksh, bash o zsh:

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

En cualquier shell, puede eliminar espacios en blanco iniciales y finales y normalizar todos los espacios en blanco intermedios en un solo espacio como este:

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

set +fapaga el engorde; Si sabe que los datos no contienen ninguno de los caracteres \[?*, puede omitirlos.

Gilles 'SO- deja de ser malvado'
fuente
respuesta interesante +1
munish
@BinaryZebra El globbing ocurre en set -- $set_jobs_count. set_jobs_count=$*es equivalente a set_jobs_count="$@"desde $*y $@solo son equivalentes cuando no están entre comillas y el lado derecho de una asignación se analiza de la misma manera que una cadena entre comillas dobles.
Gilles 'SO- deja de ser malvado'