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

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.


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.


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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.