Xóa tất cả các khoảng trắng, tab, dòng mới, vv khỏi một biến?


25

Đây là lỗi tôi đang gặp phải và nó không thành công do một biến có giá trị được coi là 2 (Tôi đang nhận lỗi này bằng cách sử dụng a select * from tabel). Tôi đang nhận được không gian trong biến đó.

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

Làm cách nào để xóa tất cả các khoảng trắng hoặc dòng mới khỏi biến đó? Có thể tr, sedhoặc bất cứ điều gì giúp đỡ?

Đây là những gì tôi đang làm:

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)

Điều này hoạt động như đề xuất:

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

Nhưng tôi vẫn đạt được một giá trị như:

  set_jobs_count=
  2

1
Bạn có thể truyền một chuỗi đến một int trong câu lệnh select. Làm thế nào được thực hiện tùy thuộc vào cơ sở dữ liệu, Sybase, Oracle, MySQL, v.v.
bsd

1
Làm thế nào để tôi làm điều đó, tôi có
orory

1
sử dụng sed nó | sed 's/[[:space:]]//g'để thu gọn khoảng trắng
bsd

cảm ơn hoạt động đến một mức độ nào đó nhưng vẫn có giá trị của biến như thếset_jobs_count= 2
munish

Tùy thuộc vào vỏ, bạn có thể làm điều đó mà không cần bất kỳ công cụ bên ngoài. Xem stackoverflow.com/a/3352015/587717
Edd Steel

Câu trả lời:


38

Bạn có thể sử dụng tr, như trong tr -d '\040\011\012\015', sẽ loại bỏ khoảng trắng, tab, trả về vận chuyển và dòng mới.


3
Có một lợi thế của việc sử dụng \040\011\012\015hơn [:space:]?
Nick

Tính di động với các phiên bản UNIX rất cũ là lý do duy nhất tôi có thể nghĩ đến --- đủ cũ để phiên bản UNIX có trước POSIX.1 .
Kyle Jones

1
Nó là gì với %ký tự ở cuối đầu ra? Đoán xem đó là một cách Linux nào đó nói với tôi rằng đầu ra dừng ở đó?
atripes

4

Trong ksh, bash hoặc zsh:

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

Trong bất kỳ shell nào, bạn có thể xóa khoảng trắng hàng đầu và dấu và chuẩn hóa tất cả các khoảng trắng trung gian thành một khoảng trắng như thế này:

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

set +ftắt Globing; nếu bạn biết rằng dữ liệu không chứa ký tự nào \[?*, bạn có thể bỏ qua nó.


câu trả lời thú vị +1
munish

@BinaryZebra Việc Globing xảy ra tại set -- $set_jobs_count. set_jobs_count=$*tương đương với set_jobs_count="$@"kể từ $*$@chỉ tương đương khi không được trích dẫn và phía bên phải của một bài tập được phân tích cú pháp giống như một chuỗi trích dẫn kép.
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.