Видалення всіх пробілів, вкладок, нових рядків тощо зі змінної?


25

Це помилка, яку я отримую, і вона провалюється через змінну, значення якої повинно бути 2 (я отримую це за допомогою a select * from tabel). У цій змінній я отримую пробіли.

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

Як видалити всі ці пробіли чи новий рядок із цієї змінної? Може tr, sedчи що-небудь допомогти?

Це те, що я роблю:

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)

Це працює, як було запропоновано:

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

Але я все одно отримую таке значення, як:

  set_jobs_count=
  2

1
Ви можете передати рядок до int у операторі select. Як це зробити, залежить від бази даних, Sybase, Oracle, MySQL тощо
bsd

1
як мені це зробити, у мене є оракул 9i
1212

1
з використанням СЕД це | sed 's/[[:space:]]//g'руйнуватися пробільні
BSD

подяка працює певною мірою, але все-таки значення змінної приходять такset_jobs_count= 2
1212

Залежно від оболонки, ви можете це зробити без будь-яких зовнішніх інструментів. Дивіться stackoverflow.com/a/3352015/587717
Edd Steel

Відповіді:


38

Ви можете використовувати tr, як у tr -d '\040\011\012\015', щоб видалити пробіли, вкладки, повернення каретки та нові рядки.


3
Чи є перевага використання \040\011\012\015над [:space:]?
Нік

Переносимість із дуже старими версіями UNIX - це єдина причина, яку я можу вважати --- достатньо старої, що версія UNIX передує POSIX.1 .
Кайл Джонс

1
Що це з %символом у кінці виводу? Здогадаєтесь, це якийсь спосіб Linux сказати мені, що вихід там зупиняється?
atripes

4

В ksh, bash або zsh:

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

У будь-якій оболонці ви можете видалити пробіли та пробіли пробілів та нормалізувати всі проміжні пробіли до одного простору, як це:

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

set +fвимикає глобус; якщо ви знаєте, що дані не містять жодного символу \[?*, ви можете їх опустити.


цікава відповідь +1
ман

@BinaryZebra Глобінг відбувається в set -- $set_jobs_count. set_jobs_count=$*еквівалентна з set_jobs_count="$@"тих пір $*і $@є еквівалентною лише тоді, коли це не котирується, а права частина завдання проаналізована аналогічно рядку з подвійним цитуванням.
Жиль "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.