Menghapus semua spasi, tab, baris baru, dll dari variabel?

25

Ini adalah kesalahan yang saya dapatkan dan gagal karena variabel yang nilainya seharusnya 2 (saya mendapatkan ini menggunakan a select * from tabel). Saya mendapatkan spasi dalam variabel itu.

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

Bagaimana cara menghapus semua spasi atau baris baru dari variabel itu? Bisakah tr,, sedatau apa pun membantu?

Ini yang saya lakukan:

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)

Ini berfungsi seperti yang disarankan:

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

Tapi saya masih mendapatkan nilai seperti:

  set_jobs_count=
  2
munish
sumber
1
Anda dapat melemparkan string ke int di pernyataan pilih. Cara melakukannya tergantung pada basis data, Sybase, Oracle, MySQL, dll.
bsd
1
bagaimana saya melakukannya, saya punya oracle 9i
munish
1
menggunakan sed itu | sed 's/[[:space:]]//g'untuk meruntuhkan spasi putih
bsd
terima kasih bekerja sampai batas tertentu tetapi masih nilai-nilai variabel datang sepertiset_jobs_count= 2
munish
Bergantung pada shell, Anda mungkin dapat melakukannya tanpa alat eksternal. Lihat stackoverflow.com/a/3352015/587717
Edd Steel

Jawaban:

38

Anda dapat menggunakan tr, seperti pada tr -d '\040\011\012\015', yang akan menghapus spasi, tab, pengembalian carriage, dan baris baru.

Kyle Jones
sumber
3
Apakah ada keuntungan menggunakan \040\011\012\015lebih dari itu [:space:]?
Nick
Portabilitas dengan versi UNIX yang sangat lama adalah satu-satunya alasan yang dapat saya pikirkan --- cukup lama bahwa versi UNIX sebelum POSIX.1 .
Kyle Jones
1
Ada apa dengan %karakter di akhir output? Kira itu semacam cara Linux mengatakan kepada saya bahwa output berhenti di sana?
Atrip
4

Dalam ksh, bash, atau zsh:

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

Dalam shell apa pun, Anda dapat menghapus spasi putih terkemuka dan tertinggal dan menormalkan semua spasi putih menengah ke ruang tunggal seperti ini:

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

set +fmematikan globbing; jika Anda tahu bahwa data tidak mengandung karakter apa pun \[?*, Anda dapat menghilangkannya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
jawaban yang menarik +1
munish
@ Binzebra Globase terjadi pada set -- $set_jobs_count. set_jobs_count=$*setara dengan set_jobs_count="$@"karena $*dan $@hanya setara ketika tidak dikutip dan sisi kanan penugasan diuraikan dengan cara yang sama dengan string yang dikutip ganda.
Gilles 'SANGAT berhenti menjadi jahat'