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.