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


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
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="$@"так $*и $@только эквивалентны , когда некотируемых и правая сторона присвоения обрабатывается таким же образом , как двойные кавычки.
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.