در دنیای لینوکس وجود ابزاری قدرتمند که بتواند سریع و بدون نیاز به باز کردن فایل های لینوکسی در ویرایشگر آن را مدیریت کند بسیار ضروری می باشد، sed میتواند با استفاده از الگوهای جستجو، جایگزینی و دستورات متنوع، به صورت خودکار تغییرات گستردهای روی فایلها اعمال کند. این ویژگیها sed را به ابزاری بینظیر برای ویرایش فایلهای متنی حجیم و خودکارسازی فرآیندهای تکراری تبدیل کرده است.
این مقاله به طور جامع به معرفی دستورات اصلی و کاربردی sed پرداخته، و نحوه استفاده از سوئیچها، الگوها و عملیات پیشرفته مانند جایگزینی، گروهبندی و حذف خطوط را بررسی میکند. با مطالعه این راهنما، میتوانید به خوبی از قابلیتهای sed برای ویرایش متون در محیطهای لینوکسی استفاده کنید.
تعریف sed:
مخفف Stream Editor (ویرایشگر جریانی) که به راحتی می تواند تعداد زیادی از کلمات را با استفاده از الگوها و دستوارت پیشرفته تغییر دهد.
دستور sed به طور پیش فرض اولین الگویی که با آن تطابق دارد را پیدا کرد و آن را تغییر می دهد و به خط بعدی می رود .
سینتکس دستور sed:
sed Options ‘Script‘ File-name
options: پارامترهای مختلفی هستند که میتوانند خروجی یا رفتار sed را تغییر دهند.
‘pattern‘: الگویی که قرار است روی خطوط اعمال شود.
File-name: فایلی است که میخواهیم پردازش کنیم.
عملیاتهای پایه در sed
سوئیچ p:
برای چاپ خطوطی که با pattern مطابقت داشته باشند.
سوئیچ n-:
عدم نمایش خطوط به جزء خطوطی که با pattern مطابقت دارد.
sed -n '/pattern/p' file.txt
مثال: عدم نمایش تمام خطوط به جزء خطوط شماره ۱ تا ۴..
sed -n '1,4p' file.txt
سوئیچ e-:
امکان اجرای چندین دستور متوالی.
sed -n -e '1,4p' -e '31,34p' file.txt
دستور بالا، خطوط ۱ تا ۴ و ۳۱ تا ۳۴ از فایل متنی را به شما نشان می دهد.
سوئیچ s-:
برای جایگزینی یک متن با متن دیگر
sed 's/old_text/new_text/' file.txt
این دستور old_text را با new_text در هر خط جایگزین میکند.
سوئیچ d:
خطوطی را که با pattern مطابقت دارند، حذف میکند.
sed '/pattern/d' file.txt
سوئیچ i-:
به طور پیشفرض، sed فقط نتیجه را در خروجی چاپ میکند. برای ذخیره تغییرات از سوئیچ i- استفاده میکنیم.
sed -i 's/old_text/new_text/g' file.txt
سوئیچ i:
برای درج متن قبل از خطی که با الگوی داده شده مطابقت دارد
sed '/pattern/i\This is a new line' file.txt
سوئیچ a:
برای درج متن بعد از خطی که با الگوی داده شده مطابقت دارد
sed '/pattern/a\This is a new line' file.txt
مثال: فرض کنید یک فایل به نام file.txt با محتوای زیر داریم:
apple
banana
cherry
date
دو دستور زیر را وارد میکنیم:
sed '/banana/i\This is a new line' file.txt
sed '/banana/a\This is a new line' file.txt
خروجی:
apple
This is a new line
banana
This is a new line
cherry
date
جهت اضافه کردن خط جدید به خط بعد از خط موردنظر (مثلاً خط دوم) می توانید از دستور زیر استفاده کنید:
sed '2a\This is a new line' file.txt
اگر می خواهید این خط را به خط قبل از خط موردنظر اضافه کنید، باید آپشن a را با i جایگزین کنید:
sed '2i\This is a new line' file.txt
اگر می خواهید چند خط را به خط بعد از خط دوم اضافه کنید، باید این خطوط را به صورت زیر تعریف کنید:
sed '2a\This is line 1\nThis is line 2' file.txt
برای اضافه کردن خط جدید به انتهای فایل هم می توانید از علامت $ استفاده کنید:
sed '$a\This is the last line' file.txt
استفاده از متاکاراکترها در sed:
^ : فقط خطوطی را که با pattern شروع میشود نمایش میدهد.
sed -n '/^pattern/p' file.txt
$ : فقط خطوطی را که با pattern تمام می شوند نمایش میدهد.
sed -n '/pattern$/p' file.txt
*.pattern*. : هر خطی که در آن pattern به کار رفته باشد نمایش میدهد.
sed -n '/.*pattern.*/p' file.txt
سوئیچ g-:
مخفف global می باشد، به طور پیشفرض، sed فقط اولین مورد را در هر خط جایگزین میکند. سوئیچ g- میتوانید همه موارد را جایگزین کند.
sed 's/old_text/new_text/g' file.txt
جایگزینی پیشرفته و استفاده از گروهها
استفاده از گروهها در sed
-
- گروه بندی با پرانتز:
- در sed، میتوانید با استفاده از پرانتزهای \(…\) قسمتهای خاصی از متن را گروهبندی کنید. این کار به شما اجازه میدهد تا آنها را بعداً در متن جایگزین استفاده کنید.
- / به عنوان تقسیمکننده برای تعیین قسمتهای مختلف دستور جایگزینی است.
- \ برای فرار دادن کاراکترهای خاص و گروهبندی استفاده میشود.
- گروه بندی با پرانتز:
مثال: فرض کنید شماره تلفنی به این شکل دارید: ۱۲۳-۴۵۶-۷۸۹۰ و میخواهید این شماره را به شکل (۱۲۳) ۴۵۶-۷۸۹۰ تغییر دهید.
echo "123-456-7890" | sed 's/\([0-9]\{3\}\)-\([0-9]\{3\}\)-\([0-9]\{4\}\)/(\1) \2-\3/'
توضیح اجزای دستور
-
- s/…/…/: این بخش برای جایگزینی است.
- \([۰-۹]\{۳\}\): این نشاندهنده گروه اول است. این قسمت به معنی “سه عدد” است.
- –: این کاراکتر دقیقا یک خط تیره را جستجو میکند.
- \([۰-۹]\{۳\}\): این قسمت دومین گروه را مشخص میکند (سه عدد بعد از خط تیره).
- \([۰-۹]\{۴\}\): این قسمت سومین گروه را مشخص میکند (چهار عدد بعد از خط تیره دوم).
مقادیر جایگزینی
-
- ۱\: به معنی مقدار گروه اول (یعنی ۱۲۳).
- ۲\: به معنی مقدار گروه دوم (یعنی ۴۵۶).
- ۳\: به معنی مقدار گروه سوم (یعنی ۷۸۹۰).
خروجی
-
- نتیجه این دستور میشود: (۱۲۳) ۴۵۶-۷۸۹۰.
سوئیچ ^$:
برای حذف خطوط خالی از یک فایل، ^$ یعنی خطی که هیچ چیزی بین شروع و پایان آن نیست.
sed '/^$/d' file.txt
حذف فاصلهها و تبهای اضافی در انتهای خطوط
این دستور فاصلههای اضافی را از انتهای خطوط حذف میکند:
sed 's/[ \t]*$//' file.txt
توضیحات اجزای دستور
-
-
- ‘/…/…/’s:
این بخش به معنی جایگزینی است. به sed میگوید که چیزی را جستجو کند و آن را با چیزی دیگر جایگزین کند. - [t\ ]:
- [ ]: این نشانه به معنی یک مجموعه از کاراکترها است. یعنی میتوانید یکی از کاراکترهای داخل براکت [ ] را مطابقت دهید.
- (فاصله): اینجا به فاصلههای معمولی اشاره دارد.
- t\: این به معنی تب است. در بسیاری از زبانها و ابزارها به عنوان کاراکتر فاصله عمودی شناخته میشود.
- *: هرچی.
- بنابراین *[ \t] به معنی هر تعداد فاصله یا تب است (از جمله هیچکدام).
- $:
- این نشانه به معنی پایان خط است.
- $*[t\ ] برای اینکه بررسی کنیم که آیا مجموعه کاراکترهای *[t\ ] در انتهای خط وجود دارد یا خیر.
- //:
- بخش دوم دستور s، که بعد از / دوم قرار دارد، خالی است. یعنی میخواهیم کاراکترهایی را که جستجو کردیم (فاصلهها و تبها) با هیچچیز جایگزین کنیم، یعنی آنها را حذف کنیم.
- ‘/…/…/’s:
-
جابجایی کلمات در خط
با استفاده از گروهبندی، میتوانیم جای دو کلمه را در خط تغییر دهیم:
'/echo "hello world" | sed 's/\(hello\) \(world\)/\2 \1
توضیحات اجزای دستور:
-
-
- echo:
-
-
-
- برای چاپ متن و ارسال آن متن به عنوان ورودی دستور sed.
-
-
-
- /…/…/s:
- این بخش به معنی جایگزینی است. با این دستور به sed میگوییم که یک الگو را جستجو کند و آن را با یک الگوی دیگر جایگزین کند.
- \(…\):
- این پرانتزها برای گروهبندی استفاده میشوند. به sed میگویند که قسمتهای داخل پرانتز را به عنوان گروههای جداگانه ذخیره کند.
- در اینجا، \(hello\) گروه اول و \(world\) گروه دوم است.
- الگوی جستجو:
- ۱\: به معنی مقدار گروه اول، یعنی hello.
- ۲\: به معنی مقدار گروه دوم، یعنی world.
- محتوای الگو:
- در این دستور، \(hello\) \(world\) به دنبال این میگردد که آیا میتواند hello و world را در یک خط پیدا کند و آنها را به ترتیب مشخص شده در دستور جایگزینی استفاده کند.
- جایگزینی:
- \۲ \۱: در اینجا، ما گروه دوم (world) را در ابتدا و سپس گروه اول (hello) را بعد از آن قرار میدهیم. بنابراین hello world به world hello تغییر مییابد.
- /…/…/s:
-
ورودی: hello world
خروجی: world hello
نتیجه گیری:
دستور sed ابزاری قدرتمند و کارآمد برای ویرایش و پردازش متون در لینوکس و دیگر سیستمهای یونیکسی است که امکانات گستردهای برای کار با فایلهای متنی در اختیار کاربران قرار میدهد. با یادگیری و استفاده از دستورات مختلف sed مانند جایگزینی، حذف، گروهبندی و درج متن، کاربران میتوانند ویرایشهای پیچیده و پرحجم را تنها با چند خط دستور انجام دهند و زمان خود را در کار با دادههای متنی بهینه کنند.