Rimuovere tutti gli spazi, le schede, le nuove righe, ecc. Da una variabile?


25

Questo è l'errore che sto ricevendo e non riesce a causa di una variabile il cui valore dovrebbe essere 2 (sto ottenendo questo usando a select * from tabel). Sto ottenendo spazi in quella variabile.

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

Come rimuovo tutti quegli spazi o una nuova riga da quella variabile? Può tr, sedo altro, aiutare?

Questo è quello che sto facendo:

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)

Funziona come suggerito:

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

Ma ottengo ancora un valore come:

  set_jobs_count=
  2

1
È possibile eseguire il cast di una stringa in un int nell'istruzione select. Come ciò dipende da database, Sybase, Oracle, MySQL, ecc.
bsd

1
come faccio, ho oracle 9i
munish

1
usare sed per | sed 's/[[:space:]]//g'far collassare gli spazi bianchi
bsd

grazie funziona fino a un certo punto, ma comunque i valori della variabile arrivano comeset_jobs_count= 2
munish

A seconda della shell, potresti essere in grado di farlo senza strumenti esterni. Vedi stackoverflow.com/a/3352015/587717
Edd Steel

Risposte:


38

Puoi usare tr, come in tr -d '\040\011\012\015', che rimuoverà spazi, tabulazioni, ritorni a capo e newline.


3
C'è un vantaggio nell'utilizzare \040\011\012\015over [:space:]?
Nick,

La portabilità con versioni UNIX molto vecchie è l'unica ragione a cui riesco a pensare --- abbastanza vecchio che la versione UNIX precede POSIX.1 .
Kyle Jones,

1
Che cos'è il %carattere alla fine dell'output? Immagino sia una specie di modo Linux di dirmi che l'output si ferma qui?
atripes

4

In ksh, bash o zsh:

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

In qualsiasi shell, è possibile rimuovere gli spazi bianchi iniziali e finali e normalizzare tutti gli spazi bianchi intermedi in un singolo spazio come questo:

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

set +fspegne il globbing; se sai che i dati non contengono nessuno dei caratteri \[?*, puoi ometterli.


risposta interessante +1
munish

@BinaryZebra Il trauma accade a set -- $set_jobs_count. set_jobs_count=$*è equivalente a set_jobs_count="$@"da $*e $@sono equivalenti solo quando non quotati e il lato destro di un compito viene analizzato allo stesso modo di una stringa tra virgolette doppie.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.