آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پرسش و پاسخ شماره ۵۲

پرسش و پاسخ شماره ۵۲

چطور می‌توانم یک فایل را از فرمت DOS به فرمت UNIX تبدیل کنم( CRها را از CR-LF خاتمه دهنده سطرها حذف کنم)؟

در برخی سیستم‌ها برای علامت زدن انتهای سطر، کاراکترهای رفتن سر سطر‎(CR)‎به کار می‌روند. سه نوع مختلف انتهای سطر رایج است:

  • سیستم‌های یونیکس فقط از تعویض سطر(LF)ها استفاده می‌کنند.
  • سیستم‌های MS-DOS و Windows از یک جفت CR-LF استفاده می‌کنند.
  • سیستم‌های قدیمی Macintosh فقط از 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)