Удалить все пробелы, табуляции, новые строки и т. Д. Из переменной?

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
Munish
источник
1
Вы можете привести строку к int в операторе select. Как это сделать, зависит от базы данных, Sybase, Oracle, MySQL и т. Д.
BSD
1
как мне это сделать, у меня есть оракул 9i
munish
1
С помощью SED это | sed 's/[[:space:]]//g'разрушить пробелы
BSD
Спасибо, до некоторой степени работает, но все же значения переменных приходят какset_jobs_count= 2
munish
В зависимости от оболочки вы можете сделать это без каких-либо внешних инструментов. См. 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
Что это с %персонажем в конце вывода? Угадайте, это какой-то способ сказать мне, что вывод на этом останавливается?
atripes
4

В кш, баш или зш:

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="$@"так $*и $@только эквивалентны , когда некотируемых и правая сторона присвоения обрабатывается таким же образом , как двойные кавычки.
Жиль "ТАК - перестань быть злым"