Sed

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

‎C.1‎- ‏Sed

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

Sed سطرهایی از ورودی‌اش را که بر آنها عمل خواهد کرد از محدوده آدرس داده شده به آن تعیین می‌کند. ‎[2]‎ مشخص کردن این محدوده آدرس یا به وسیله شماره سطر یا به وسیله الگویی برای انطباق صورت می‌گیرد. برای مثال، ‎3d‎ حذف کردن سطر ‎3‎ ورودی را به sed علامت می‌دهد، و ‎/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 در محل address اشاره شده‎. معمولا با گزینه ‎-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 از گزینه ‎-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» در هر سطر را حذف می‌کند، بقیه سطر سالم باقی می‌ماند.
مترجم: عملیاتsed فقط بر روی خروجی اثر می‌کند و فایل مورد پردازش بدون تغییر باقی می‌ماند مگر آنکه از گزینه ‎-i‎ استفاده گردد.

جانشینی رشته‌ای با طول صفر با یک رشته دیگر معادل است با حذف آن رشته از یک سطر ورودی. این عمل بقیه سطر را دست نخورده باقی می‌گذارد. با اعمال کردن ‎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]

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