راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

فصل ۵ - sed ویرایشگر جریانی گنو »
« ویرایش غیر محاوره‌ای

ویرایش محاوره‌ای

چاپ سطرهای شامل یک الگو

البته، اینها کارهایی است که با grep، هم می‌توانید انجام دهید، اما با آن فرمان نمی‌توانید “جستجو و تعویض ” را انجام دهید. این فقط برای شروع به کار شماست.

این فایل متنی مثال ما می‌باشد:

sandy ~> cat -n example
     1  This is the first line of an example text.
     2  It is a text with erors.
     3  Lots of erors.
     4  So much erors, all these erors are making me sick.
     5  This is a line not containing any errors.
     6  This is the last line.

sandy ~>

می‌خواهیم sed تمام سطرهای شامل الگوی جستجوی ما، که در این حالت، رشته “erors” می‌باشد را پیدا کند. ما از p برای به دست آوردن نتیجه استفاده می‌کنیم:

sandy ~> sed  '/erors/p' example
This is the first line of an example text.
It is a text with erors.
It is a text with erors.
Lots of erors.
Lots of erors.
So much erors, all these erors are making me sick.
So much erors, all these erors are making me sick.
This is a line not containing any errors.
This is the last line.

sandy ~>

به طوری که ملاحظه می‌کنید، sed تمام فایل را چاپ می‌کند، اما سطرهای محتوی رشته جستجو را دوبار چاپ می‌کند. این آنچه ما می‌خواهیم نیست. به منظور آن که فقط سطرهایی که با الگوی ما منطبق می‌شود، چاپ گردند، گزینه n- را به کار می‌بریم:

sandy ~> sed -n '/erors/p' example
It is a text with erors.
Lots of erors.
So much erors, all these erors are making me sick.

sandy ~>

حذف سطرهایی از ورودی که شامل یک الگو می‌باشند

ما از همان نمونه فایل متنی استفاده می‌کنیم. حالا می‌خواهیم فقط سطرهایی را که شامل رشته جستجو نیستند را ببینیم:

sandy ~> sed '/erors/d' example
This is the first line of an example text.
This is a line not containing any errors.
This is the last line.

sandy ~>

دستور d موجب می‌شود سطرهایی که شامل الگو نیستند، نمایش داده شوند.

مطابقت دادن سطرهایی که با یک الگو شروع و با الگوی دیگر خاتمه یابند به این صورت نشان داده می‌شود:

sandy ~> sed -n '/^This.*errors.$/p' example
This is a line not containing any errors.

sandy ~>

توجه داشته باشید که به منظور انطباق کاراکتر نقطه انتهایی، باید آن را با کاراکتر گریز پوشش دهیم. در مثال ما عبارت با هر کاراکتری، از جمله نقطه انتهایی منطبق می‌گردد.

دامنه‌های سطرها

در اینجا می‌خواهیم سطرهایی که شامل خطاها هستند را بیرون بکشیم. در مثال ما سطرهای ۲ تا ۴ می‌باشند. مشخص نمودن این دامنه آدرس، به طور یکجا با دستور d به این شکل:

sandy ~> sed '2,4d' example
This is the first line of an example text.
This is a line not containing any errors.
This is the last line.

sandy ~>

برای چاپ یک فایل از ابتدا تایک سطر معین از فایل، دستوری مشابه این را به کار ببرید:

sandy ~> sed '3,$d' example
This is the first line of an example text.
It is a text with erors.

sandy ~>

این فقط دوسطر اول فایل نمونه ما را چاپ می‌کند.

دستور زیر اولین سطر شامل الگوی“a text”، تا اولین سطر بعدی که شامل الگوی “This” باشد را چاپ می‌کند:

sandy ~> sed -n '/a text/,/This/p' example
It is a text with erors.
Lots of erors.
So much erors, all these erors are making me sick.
This is a line not containing any errors.

sandy ~>

جستجو و تعویض با sed

حالا ما در فایل مثال، فقط جستجو و تعویض رشته errors را به جای رشته مورد جستجو در سطرهای انتخابی یا همه سطرها انجام می‌دهیم.

sandy ~> sed 's/erors/errors/' example
This is the first line of an example text.
It is a text with errors.
Lots of errors.
So much errors, all these erors are making me sick.
This is a line not containing any errors.
This is the last line.

sandy ~>

به طوری که مشاهده می‌کنید، این به طور دقیق اثر مطلوب ما را ندارد: در سطر ۴، فقط اولین موردتطابق با رشته جستجو تعویض گردیده است، و هنوز یک 'eror' باقی مانده است. از دستور g برای نشان دادن به sed که ما از او می‌خواهیم به جای توقف در اولین مورد انطباق، تمام سطر را بررسی کند، استفاده می‌کنیم:

sandy ~> sed 's/erors/errors/g' example
This is the first line of an example text.
It is a text with errors.
Lots of errors.
So much errors, all these errors are making me sick.
This is a line not containing any errors.
This is the last line.

sandy ~>

برای درج یک رشته در ابتدای هر یک از سطرهای یک فایل، به عنوان نمونه برای نقل‌قولی نمودن:

sandy ~> sed 's/^/> /' example
> This is the first line of an example text.
> It is a text with erors.
> Lots of erors.
> So much erors, all these erors are making me sick.
> This is a line not containing any errors.
> This is the last line.

sandy ~>

درج رشته‌ها در انتهای هر سطر:

sandy ~> sed 's/$/EOL/' example
This is the first line of an example text.EOL
It is a text with erors.EOL
Lots of erors.EOL
So much erors, all these erors are making me sick.EOL
This is a line not containing any errors.EOL
This is the last line.EOL

sandy ~>

دستورات چنگانه جستجو و جایگزینی با گزینه‌های جداگانه e- از یکدیگر جدامی‌شوند:

sandy ~> sed -e 's/erors/errors/g' -e 's/last/final/g' example
This is the first line of an example text.
It is a text with errors.
Lots of errors.
So much errors, all these errors are making me sick.
This is a line not containing any errors.
This is the final line.

sandy ~>

به خاطر داشته باشید که به طور پیش‌فرض sed نتایجش را در خروجی استاندارد چاپ می‌کند، به احتمال بسیار زیاد در پنجره ترمینال شما. اگر می‌خواهید خروجی را در یک فایل ذخیره کنید، آن را تغییر مسیر بدهید:

sed option 'some/expression' file_to_process > sed_output_in_a_file

[Tip]مثال‌های بیشتر

مثال‌های فراوانی از sed را در اسکریپت‌های شروع اولیه سیستم خود که به طور معمول دردایرکتوری ‎ /etc/init.d‎ یا ‎/etc/rc.d/init.d‎ قرار دارند، می‌توانید پیدا کنید. به دایرکتوری محتوی فایل‌های initscript در سیستم خود بروید و دستور زیر را صادر کنید:

grep sed *

فصل ۵ - sed ویرایشگر جریانی گنو »
« ویرایش غیر محاوره‌ای
ترجمه محمود پهلوانی