Alle Leerzeichen, Tabulatoren, Zeilenumbrüche usw. aus einer Variablen entfernen?

25

Dies ist der Fehler, den ich erhalte und der aufgrund einer Variablen fehlschlägt, deren Wert 2 sein soll (ich erhalte dies mit a select * from tabel). Ich erhalte Leerzeichen in dieser Variablen.

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

Wie entferne ich alle diese Leerzeichen oder Zeilenumbrüche aus dieser Variablen? Kann tr, sedoder irgendetwas helfen?

Das mache ich:

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)

Dies funktioniert wie vorgeschlagen:

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

Aber ich erhalte immer noch einen Wert wie:

  set_jobs_count=
  2
münchen
quelle
1
Sie können in der select-Anweisung einen String in einen int umwandeln. Wie das ist , hängt von Datenbank durchgeführt, Sybase, Oracle, MySQL, usw.
bsd
1
Wie mache ich das
?
1
mit sed ist es | sed 's/[[:space:]]//g',
whitespace
Danke funktioniert bis zu einem gewissen Grad, aber die Werte der Variablen kommen wieset_jobs_count= 2
munish
Je nach Shell können Sie möglicherweise auf externe Tools verzichten. Siehe stackoverflow.com/a/3352015/587717
Edd Steel,

Antworten:

38

Sie können trwie in verwenden tr -d '\040\011\012\015', um Leerzeichen, Tabulatoren, Zeilenumbrüche und Zeilenumbrüche zu entfernen.

Kyle Jones
quelle
3
Gibt es einen Vorteil der Verwendung \040\011\012\015gegenüber [:space:]?
Nick
Portabilität mit sehr alten UNIX-Versionen ist der einzige Grund, den ich mir vorstellen kann - alt genug, dass die UNIX-Version älter ist als POSIX.1 .
Kyle Jones
1
Was ist es mit dem %Zeichen am Ende der Ausgabe? Schätze, es ist eine Art Linux-Art, mir mitzuteilen, dass die Ausgabe dort stoppt?
Reife
4

In ksh, bash oder zsh:

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

In jeder Shell können Sie führende und nachfolgende Leerzeichen entfernen und alle dazwischen liegenden Leerzeichen auf ein einzelnes Leerzeichen normalisieren:

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

set +fDeaktiviert das Globbing. Wenn Sie wissen, dass die Daten keines der Zeichen enthalten \[?*, können Sie es weglassen.

Gilles 'SO - hör auf böse zu sein'
quelle
interessante Antwort +1
munish
@BinaryZebra Das Globbing findet um statt set -- $set_jobs_count. set_jobs_count=$*ist äquivalent zu set_jobs_count="$@"since $*und $@ist nur äquivalent, wenn keine Anführungszeichen vorhanden sind und die rechte Seite einer Zuweisung wie eine Zeichenfolge in doppelten Anführungszeichen analysiert wird.
Gilles 'SO- hör auf böse zu sein'