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 | چاپ [محدوده آدرس مشخص شده] | |
[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» در هر سطر را حذف میکند، بقیه سطر سالم باقی میماند. |
جانشینی رشتهای با طول صفر با یک رشته دیگر معادل است با حذف آن رشته از یک سطر ورودی. این عمل بقیه سطر را دست نخورده باقی میگذارد. با اعمال کردن 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 را ببینید. |
یک روش سریع برای یک سطر در میان نمودن متن یک فایل، sed G filename است. |
برای نمونههای توضیحدهنده sed در درون اسکریپتها، مثالهای زیر را ببینید:
برای یک بررسی گسترده از sed، به مرجعهای مربوطه در کتابنامه مراجعه نمایید.
[1] | Sed بدون مداخله کاربر عمل میکند. |
[2] | اگر محدوده آدرس تعیین نشده باشد، تمام سطرها پیشفرض آن است. |