Supprimer tous les espaces, tabulations, sauts de ligne, etc. d'une variable?

25

C'est l'erreur que j'obtiens et elle échoue à cause d'une variable dont la valeur est supposée être 2 (j'obtiens ceci en utilisant a select * from tabel). J'obtiens des espaces dans cette variable.

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

Comment supprimer tous ces espaces ou une nouvelle ligne de cette variable? Est tr-ce que sed, ou quelque chose peut aider?

Voici ce que je fais:

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)

Cela fonctionne comme suggéré:

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

Mais j'obtiens toujours une valeur comme:

  set_jobs_count=
  2
munish
la source
1
Vous pouvez convertir une chaîne en un entier dans l'instruction select. La façon dont cela se fait dépend de la base de données, Sybase, Oracle, MySQL, etc.
bsd
1
comment faire, j'ai oracle 9i
munish
1
en utilisant sed c'est | sed 's/[[:space:]]//g'pour effacer les espaces blancs
bsd
merci fonctionne dans une certaine mesure, mais les valeurs de variable sont toujours commeset_jobs_count= 2
munish
Selon le shell, vous pouvez le faire sans aucun outil externe. Voir stackoverflow.com/a/3352015/587717
Edd Steel

Réponses:

38

Vous pouvez utiliser tr, comme dans tr -d '\040\011\012\015', qui supprimera les espaces, les tabulations, les retours chariot et les retours à la ligne.

Kyle Jones
la source
3
Y a-t-il un avantage à utiliser \040\011\012\015plus [:space:]?
Nick
La portabilité avec des versions UNIX très anciennes est la seule raison pour laquelle je peux penser --- assez ancienne pour que la version UNIX soit antérieure à POSIX.1 .
Kyle Jones
1
Qu'est-ce que c'est avec le %personnage à la fin de la sortie? Je suppose que c'est une sorte de façon Linux de me dire que la sortie s'arrête là?
atripes
4

En ksh, bash ou zsh:

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

Dans n'importe quel shell, vous pouvez supprimer les espaces blancs de début et de fin et normaliser tous les espaces blancs intermédiaires en un seul espace comme celui-ci:

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

set +fdésactive la globulation; si vous savez que les données ne contiennent aucun des caractères \[?*, vous pouvez les omettre.

Gilles 'SO- arrête d'être méchant'
la source
réponse intéressante +1
munish
@BinaryZebra Le globbing se produit à set -- $set_jobs_count. set_jobs_count=$*est équivalent à set_jobs_count="$@"puisque $*et $@ne sont équivalents que lorsqu'ils ne sont pas entre guillemets et le côté droit d'une affectation est analysé de la même manière qu'une chaîne entre guillemets doubles.
Gilles 'SO- arrête d'être méchant'