پیوست ‎C- پیش درآمدی بر Sed و Awk

‎C.1‎- ‏Sed

Sed یک ‎stream editor‎ ‏(ویرایشگر جریانی) غیر محاوره‌ای است ‎[1]‎ . ورودی متن را خواه از stdin خواه از یک فایل، دریافت می‌کند، برخی عملیات را روی سطرهای مشخص شده ورودی، به طور سطر به سطر انجام می‌دهد، سپس نتیجه را در stdout یا در یک فایل می‌نویسد . داخل یک اسکریپت پوسته، معمولا sed یکی از اجزای تشکیل‌دهنده ابزار در یک لوله است.

Sed از محدوده آدرس عبور داده شده به آن، تعیین می‌کند که بر کدام سطرهای ورودی‌اش عمل خواهد کرد. ‎[2]‎ تعیین این محدوده آدرس یا به وسیله شماره سطر یا به وسیله یک الگو برای مطابقت دادن صورت می‌گیرد. برای مثال، ‎3d‎ به sed برای حذف کردن سطر ‎3‎ ورودی علامت می‌دهد، و ‎/Windows/d‎ به sed می‌گوید که شما می‌خواهید هر سطر شامل یک انطباق با «Windows» در ورودی حذف شود.

از تمام عملیات در جعبه ابزار sed، ما اساسا بر سه مورد که معمولا بیش از همه استفاده می‌شوند تمرکز می‌کنیم. اینها ‎printing‎ ‏(در stdout)‏، ‎deletion‎ ‏(حذف)، و ‎substitution‎ ‏(جایگزینی) هستند.

جدول ‎C-1‎- عملگرهای اصلی sed

عملگرنامنتیجه
[address-range]/p print چاپ ‏[محدوده آدرس مشخص شده‏]
[address-range]/d delete حذف ‏[محدوده آدرس تعیین شده‏]
s/pattern1/pattern2/ substitute جایگزینی ‎pattern2‎ برای اولین نمونه از ‎pattern1‎ در یک سطر
[address-range]/s/pattern1/pattern2/ substitute جایگزینی ‎pattern2‎ به جای اولین نمونه ‎pattern1‎ در یک سطر، در محدوده آدرس ‎address-range‎
[address-range]/y/pattern1/pattern2/ transform تعویض هر کاراکتر در ‎pattern1‎ با کاراکتر متناظر آن در ‎pattern2‎ در محدوده آدرس ‎address-range‎ (معادل tr)
[address] i pattern Filename insert درج pattern در آدرس نشان داده شده در فایل ‎Filename‎. معمولا با گزینه ‎-i‎ ‏(‎in-place‎) استفاده می‌شود.
g global بر روی هر الگوی انطباق داخل هر سطر منطبق شده از ورودی عمل می‌کند

غیر از اینکه عملگر g (سراسری) به یک فرمان جایگزینی پیوست شده باشد، عملگرهای جایگزینی فقط روی اولین نمونه از تطابق الگو در هر سطر عمل می‌کنند.

از خط فرمان و از یک اسکریپت پوسته، یک عملیات sed ممکن است نیاز به نقل‌قولی شدن و برخی گزینه‌های داشته باشد.

sed -e '/^$/d' $filename
#  گزینه ‎-e‎ باعث می‌شود رشته بعدی به عنوان یک دستورالعمل ویرایش قلمداد گردد.
#       (اگر فقط یک دستورالعمل به sed عبور داده شود، گزینه ‎-e‎ اختیاری است.)
# نقل‌قول‌های «قوی» ‎('')‎ کاراکترهای عبارت منظم در دستورالعمل را از تفسیر مجدد
#+             به وسیله بدنه اسکریپت به عنوان کاراکترهای خاص محافظت می‌کنند.
#               (این عمل، بسط عبارت منظم دستورالعمل را برای sed حفظ می‌کند.)
#
# روی متن محتوای فایل ‎$filename‎ عمل می‌کند.

در برخی موارد، یک فرمان ویرایشی sed با نقل‌قول‌های منفرد کار نخواهد کرد.

filename=file1.txt
pattern=BEGIN

  sed "/^$pattern/d" "$filename"  # به طوری که تعیین شده کار می‌کند.
#  ‎sed '/^$pattern/d' "$filename"‎  دارای نتایج غیر قابل انتظار است.
#در این نمونه، با نقل‌قول‌کردن قوی ‎(' ... ')‎، الگوی ‎$pattern‎ به ‎BEGIN‎
#+                                                 بسط نخواهد یافت.


Sed از گزینه the ‎-e‎ برای مشخص نمودن آنکه رشته بعدی یک دستورالعمل یا یک مجموعه دستورالعمل است استفاده می‌کند. اگر فقط یک دستورالعمل منفرد در رشته گنجانده شده باشد، آنوقت این گزینه می‌تواند ذکر نشود.

sed -n '/xzy/p' $filename
# گزینه ‎-n‎ به ‎sed‎ می‌گوید فقط آن سطرهایی که با الگو مطابقت دارند چاپ شوند.
#                          در غیر این صورت تمام سطرهای ورودی چاپ می‌گردند.
#  گزینه ‎-e‎ اینجا لازم نیست چون فقط یک دستورالعمل ویرایشی منفرد وجود دارد.

جدول ‎C-2‎- مثال‌هایی از عملگرهای sed

نشانه‌گذارینتیجه
8d حذف هشتمین سطر ورودی.
/^$/d حذف تمام سطرهای خالی.
1,/^$/d حذف از ابتدای ورودی تا انتهای اولین سطر خالی .
/Jones/p چاپ فقط سطرهای شامل «Jones» (با گزینه ‎-n‎).
s/Windows/Linux/ جایگزینی «Linux» برای اولین نمونه از «Windows» پیدا شده در هر سطر ورودی.
s/BSOD/stability/g جایگزینی «stability» برای هر نمونه از «BSOD» پیدا شده در هر سطر ورودی.
s/ *$// حذف تمام فاصله‌ها از انتهای هر سطر.
s/00*/0/g فشرده کردن تمام رشته‌های متوالی صفرها به یک صفر منفرد.
echo "Working on it." | sed -e '1i How far are you along?' «‎How far are you along?‎» را به عنوان سطر اول چاپ می‌کند، «‎Working on it.‎» را به عنوان سطر دوم.
5i 'Linux is great.' file.txt «‎Linux is great.‎» را در سطر ‎5‎ فایل ‎file.txt‎ درج می‌کند.
/GUI/d تمام سطرهای شامل «GUI» را حذف می‌کند.
s/GUI//g تمام نمونه‌های «GUI» در هر سطر را حذف می‌کند، بقیه سطر سالم باقی می‌ماند.

جانشینی رشته‌ای با طول صفر با یک رشته دیگر معادل است با حذف آن رشته از یک سطر ورودی. این بقیه سطر را دست نخورده باقی می‌گذارد. اعمال کردن ‎s/GUI//‎ به سطر زیر

The most important parts of any application are its GUI and sound effects
این سطر نتیجه می‌شود
The most important parts of any application are its  and sound effects

یک \ فرمان جانشینی sed را مجبور به ادامه یافتن روی سطر بعد می‌کند. این دارای اثر استفاده از newline در انتهای سطر اول به عنوان رشته جایگزین است.

s/^  */\
/g

این جایگزینی فاصله‌های ابتدای سطر را با یک سطر جدید تعویض می‌کند. نتیجه خالص تعویض نمودن تورفتگی‌های پاراگراف با یک سطر جدید بین پاراگراف‌ها می‌باشد.

یک محدوده آدرس دنبال شده با یک یا چند عملیات ممکن است به آکولادهای باز و بسته، با سطرهای جدید مناسب نیاز داشته باشد.

/[0-9A-Za-z]/,/^$/{
/^$/d
}

این فقط سطر اول سطرهای خالی متوالی را حذف می‌کند. می‌تواند برای حذف فاصله‌های خالی بین سطرها، اما از دست ندادن سطر(های) خالی بین پاراگراف‌ها سودمند باشد.


جداکننده متداولی که sed به کار می‌برد / است. اما، sed سایر جداکننده‌ها، از قبیل % را نیز اجازه می‌دهد. این برای موقعی که / بخشی از رشته تعویض است، همچون در نام مسیر فایل مفید است. مثال ‎11-10‎ و مقال ‎16-32‎ را ببینید.

tip

یک روش سریع برای یک سطر در میان نمودن متن یک فایل، ‎sed G filename‎ است.

برای نمونه‌های توضیح‌دهنده sed در درون اسکریپت‌ها، مثال‌های زیر را ببینید:

  1. مثال ‎36-1‎

  2. مثال ‎36-2‎

  3. مثال ‎16-3‎

  4. مثال ‎A-2‎

  5. مثال ‎16-17‎

  6. مثال ‎16-27‎

  7. مثال ‎A-12‎

  8. مثال ‎A-16‎

  1. مثال ‎A-17‎

  2. مثال ‎16-32‎

  3. مثال ‎11-10‎

  4. مثال ‎16-48‎

  5. مثال ‎A-1‎

  6. مثال ‎16-14‎

  7. مثال ‎16-12‎

  8. مثال ‎A-10‎

  1. مثال ‎19-12‎

  2. مثال ‎16-19‎

  3. مثال ‎A-29‎

  4. مثال ‎A-31‎

  5. مثال ‎A-24‎

  6. مثال ‎A-43‎

  7. مثال ‎A-55‎

برای یک بررسی گسترده از sed، به مرجع‌های مربوطه در کتابنامه مراجعه نمایید.

یادداشت‌ها

[1]

Sed بدون مداخله کاربر عمل می‌کند.

[2]

اگر محدوده آدرس تعیین نشده باشد، پیش‌فرض تمام سطرها می‌باشد.