Usunąć wszystkie spacje, tabulatory, znaki nowej linii itp. Ze zmiennej?

25

To jest błąd, który otrzymuję i nie działa z powodu zmiennej, której wartość powinna wynosić 2 (otrzymuję to za pomocą a select * from tabel). Dostaję spacje w tej zmiennej.

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

Jak usunąć wszystkie te spacje lub znak nowej linii z tej zmiennej? Can tr, sedlub pomaga w cokolwiek?

To co robię:

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)

Działa to zgodnie z sugestią:

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

Ale nadal otrzymuję wartość taką jak:

  set_jobs_count=
  2
Munish
źródło
1
Możesz rzutować ciąg na int w instrukcji select. To, jak to się dzieje, zależy od bazy danych, Sybase, Oracle, MySQL itp.
bsd
1
jak to zrobić, mam wyrocznię 9i
munish
1
używając sed to | sed 's/[[:space:]]//g'zwija białe znaki
bsd
dzięki działa do pewnego stopnia, ale mimo to wartości zmiennej są podobneset_jobs_count= 2
munish
W zależności od powłoki możesz to zrobić bez żadnych zewnętrznych narzędzi. Zobacz stackoverflow.com/a/3352015/587717
Edd Steel

Odpowiedzi:

38

Możesz użyć tr, jak w tr -d '\040\011\012\015', aby usunąć spacje, tabulatory, znaki powrotu karetki i znaki nowej linii.

Kyle Jones
źródło
3
Czy istnieje korzyść z używania \040\011\012\015ponad [:space:]?
Nick
Przenośność z bardzo starymi wersjami UNIX jest jedynym powodem, dla którego mogę wymyślić --- wystarczająco stary, aby wersja UNIX była wcześniejsza niż POSIX.1 .
Kyle Jones,
1
Co to jest z %postacią na końcu wyjścia? Zgadujesz, że to jakiś sposób na Linuxa, żeby powiedzieć, że wyjście się tam kończy?
atripes
4

W ksh, bash lub zsh:

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

W dowolnej powłoce możesz usunąć wiodące i końcowe białe spacje i znormalizować wszystkie pośrednie białe spacje do jednej spacji, tak jak to:

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

set +fwyłącza globbing; jeśli wiesz, że dane nie zawierają żadnego ze znaków \[?*, możesz je pominąć.

Gilles „SO- przestań być zły”
źródło
ciekawa odpowiedź +1
munish
@BinaryZebra Globbing odbywa się o set -- $set_jobs_count. set_jobs_count=$*jest równoważne set_jobs_count="$@"od tamtej pory $*i $@są równoważne tylko wtedy, gdy niecytowany, a prawa strona przypisania jest analizowana w taki sam sposób jak ciąg cudzysłowu.
Gilles „SO- przestań być zły”