กำลังลบช่องว่างแท็บบรรทัดใหม่ ฯลฯ ออกจากตัวแปรหรือไม่


25

นี่เป็นข้อผิดพลาดที่ฉันได้รับและมันล้มเหลวเนื่องจากตัวแปรที่มีค่าควรจะเป็น 2 (ฉันได้รับสิ่งนี้โดยใช้กselect * from tabel) ฉันได้รับช่องว่างในตัวแปรนั้น

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

ฉันจะลบช่องว่างเหล่านั้นทั้งหมดหรือขึ้นบรรทัดใหม่ออกจากตัวแปรนั้นได้อย่างไร Can 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
ฉันจะทำอย่างไรฉันมี oracle 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:]?
Nick

พกพากับรุ่นที่ใช้ระบบปฏิบัติการยูนิกซ์เก่ามากเป็นเหตุผลเดียวที่ฉันสามารถคิด --- พอเก่าที่ยูนิกซ์รุ่นถือกำเนิดPOSIX.1
Kyle Jones

1
มันคืออะไรกับ%ตัวละครในตอนท้ายของการส่งออก? คิดว่ามันเป็นวิธี Linux บางอย่างที่บอกฉันว่าการส่งออกหยุดที่นั่น?
atripes

4

ใน ksh, bash หรือ zsh:

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

ในเชลล์ใด ๆ คุณสามารถลบช่องว่างนำหน้าและต่อท้ายและปรับช่องว่างกลางทั้งหมดให้เป็นพื้นที่เดียวเช่นนี้:

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

set +fปิด globbing; หากคุณรู้ว่าข้อมูลไม่มีตัวอักษรใด\[?*ๆ คุณสามารถละเว้นได้


คำตอบที่น่าสนใจ +1
munish

@BinaryZebra globbing set -- $set_jobs_countที่เกิดขึ้นใน set_jobs_count=$*มีค่าเท่ากับset_jobs_count="$@"ตั้งแต่$*และ$@เทียบเท่าเมื่อไม่มีเครื่องหมายอัญประกาศและทางด้านขวาของการมอบหมายจะถูกวิเคราะห์ด้วยวิธีเดียวกับสตริงที่มีเครื่องหมายคำพูดคู่
Gilles 'หยุดชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.