برای انجام این کار چند راه وجود دارد. بعضی از از این روشها ترفندهای خاصی را شامل میگردند که فقط با فضای سفید کار میکنند. برخی دیگر بیشتر عمومیت دارند، و میتوانند برای جدا کردن صفرها به کار بروند، و غیره.
در اینجا یکی از آنها که فقط برای فضاهای سفید کار میکند، آمده است. این کُد بر این واقعیت تکیه دارد که readدر صورتی که IFS برقرار نشده باشد، تمام فضاهای سفید ابتدا و انتها را پاک میکند:
# POSIX اما در صورتیکه متغیر شامل سطرجدید باشد شکست میخورد read -r var << EOF $var EOF
Bash میتواند کار مشابهی را با یک "here string" انجام بدهد:
# Bash read -rd '' x <<< "$x"
استفاده از یک رشته تهی به عنوان جداکننده به معنی آن است که read تمام آن رشته را از بین میبرد، به طوریکه NUL استفاده میشود. (به خاطر بیاورید: BASH فقط متغیرهای رشتهای C به کار میبرد.) این برای هر متنی ازجمله شامل سطرجدید مطمئن است.
این هم راه حلی با استفاده از extglob و بسط پارامتر همراه با یکدیگر:
# Bash shopt -s extglob x=${x##+([[:space:]])} x=${x%%+([[:space:]])}
همچنین این روش در پوسته Korn بدون ضرورت تنظیم صریح extglob کار میکند:
# ksh x=${x##+([[:space:]])} x=${x%%+([[:space:]])}
این روش آنطور که چند روش اول بودند، محدود به فضاهای سفید نیست. بعلاوه، صفرهای مقدم را میتوانید حذف کنید:
# Bash shopt -s extglob x=${x##+(0)}
روش دیگری در bash برای حذف صفرهای مقدم بر عدد، رفتار کردن با آنها به عنوان عدد صحیح در یک زمینه محاسباتی است:
# Bash x=$((10#$x)) # شامل هرچیز دیگری غیر از رقم باشد این روش ناموفق است x ،هر چند اگر
اگر در پوسته POSIX نیاز به پاک کردن صفرهای مقدم دارید، میتوانید یک حلقه به کار ببرید:
# POSIX while true; do case "$var" in 0*) var=${var#0};; *) break;; esac done
یا این ترفند( با تفصیل بیشتر در پرسش و پاسخ شماره 100 پوشش داده شده):
# POSIX zeroes=${var%%[!0]*} var=${var#$zeroes}
بسیار بسیار روشهای دیگری برای انجام این کار وجود دارد، برای نمونه استفاده از sed:
# POSIX, فضاهای سفید اول و انتهای هر سطر را موقوف میکند x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
برای بریدن زوائد فایلهای بزرگ ، راه حلهای مبتنی بر برنامههای خارجی مانند sed بیشتر از متغیرهای پوسته مناسب میباشند.
پرسش و پاسخ 67 (آخرین ویرایش 2011-06-21 15:20:23 توسط GreyCat)