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

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.


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.


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'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.