در برخی سیستمها برای علامت زدن انتهای سطر، کاراکترهای رفتن سر سطر(CR)به کار میروند. سه نوع مختلف انتهای سطر رایج است:
اگر شما در حال اجرای اسکریپتی در سیستم یونیکس میباشید، لازم است انتهای سطرها یونیکسی باشد(فقط LFها)، در غیر آنصورت مشکل خواهید داشت.
یک بازرسی ساده، فقط نگاه کردن به خروجی cat -e است:
cat -e yourscript
اگر چیزی مانند این را میبینید، آنوقت با سطرهای جدید سَبکِ CRLF سر و کار دارید:
command^M$ ^M$ another command^M$
یک شیوه دیگر، استفاده از برنامه سودمند file برای پی بردن به نوع فایل است:
file yourscript
اگر فایل دارای CR باشد خروجی به شما میگوید که متن ASCII داری CR میباشد. توجه: این روش فقط در گنو-لینوکس صادق است. در سایر سیستمعاملها، نتیجه file غیرقابل پیشبینی است، به استثنای آنکه اگر نوع فایل مانند فایل متن باشد کلمه "text" در جایی از نتیجه خروجی ظاهر میشود.
imadev:~$ printf 'DOS\r\nline endings\r\n' > foo imadev:~$ file foo foo: commands text arc3:~$ file foo foo: ASCII text, with CRLF line terminators
در یک اسکریپت، گفتن آنکه کدام شیوه، قابل اعتمادترین روش خواهد بود، مشکلتر است. هر کدام که انجام بدهید، غیر مستدل خواهد بود. در تئوری، یک فایل غیر معیوب تولید شده توسط برنامه سودمند یونیکسی به سامان، تنها باید شامل LFها، و تولید شده توسط یک برنامه DOS، نباید شامل LF های ساده بدون یک CR مقدم، باشد. میتوانید این مورد را با یک PCRE بررسی کنید.
# Bash و Ksh در پوسته # [[ $(</dev/fd/0) == ~(P)(?<!$'\r')$'\n' ]] # ksh93 PCRE pattern=*[^$'\r']$'\n'* if [[ $(</dev/fd/0) == $pattern ]] <<<$'foo\r\nbar\r\nbaz\r'; then print 'File contains only CRLFs' else print 'File contains at least one newline not preceded by a CR' fi
ex یک روش استاندارد مناسب برای تبدیل CRLF به LF میباشد، و احتمالاً یکی از چند روش قابل اعتماد انجام آن به طور یکجا از داخل یک اسکریپت است:
ex -sc $'%s/\r$//e|x' file
البته، هر یک از زبانهای پویای قدرتمندتر برای انجام این کار با سهولت نسبی.
perl -pi -e 's/\r\n/\n/' filename
برخی سیستمها دارای ابزارهای معتبر ویژه تبدیل، جهت انجام این کار به طور خودکار، هستند. dos2unix، recode، و fromdos برخی نمونهها میباشند.
به طور دستی با ویرایشگری مانند nano انجام میشود:
nano -w yourscript
Ctrl-O را تایپ کنید و قبل از تأیید، Alt-D (DOS) یا Alt-M (Mac) را برای تغییر قالب تایپ نمایید.
یا در Vim از :set fileformat=unix استفاده کنید و با :w ذخیره کنید. مراقبت کنید که مقدار fenc صحیح باشد (احتمالاً utf-8).
برای آنکه به سادگی تمام CRها را از جریان ورودی پاک کنید، میتوانید از tr -d '\r' <infile >outfile استفاده نمایید. البته، شما باید مطمئن باشید که نام این فایلها یکسان نباشد.
پرسش و پاسخ 52 (آخرین ویرایش 2013-02-10 15:48:58 توسط ormaaj)