sample sed example

  • جایگزینی عبارت test.com با عبارت 1.2.3.4 در فایل input.txt
sed 's/1.2.3.4/test.com/g' input.txt
  • چاپ کردن خطوط ۲ تا ۲۱ از فایل input.txt
sed -n '2,21'p input.txt
  • پاک کردن خطوطی که با کارکتر # شروع می شوند از فایل input.txt
sed '/^#/ d' input.txt

or

cat input.txt | sed '/^#/ d'

or

sed '/^#/ d' < input.txt
  • پاک کردن خطوطی که با کارکتر # شروع می شوند و همچنین پاک کردن خطوطی که خالی هستند از فایل input.txt
sed '/^#/ d' input.txt | sed '/^$/ d'
  • نمایش تنها خط ۳ از فایل input.txt
sed -n '3p' input.txt
  • نمایش خط ۱ به انضمام چاپ خطوط بعدی با فواصل ۲تایی از فایل input.txt
sed -n '1~2p' input.txt
  • چاپ خط ۲ تا ۷ از فایل input.txt
sed -n '2,7p' input.txt
  • چاپ خط آخر از فایل input.txt
sed -n '$p' input.txt
  • چاپ خط ۳ تا آخر از فایل input.txt
sed -n '3,$p' input.txt
  • اعمال دستورات و قوانین از طریق اسکریپت با نام sed.script بر روی فایل input.txt
sed -n -f sed.script input.txt

or

cat input.txt | sed -n -f sed.script

or

sed -n -f sed.script < input.txt
  • چاپ خط یا خطوطی که در آن عبارت test وجود داشته باشد از فایل input.txt
sed -n '/test/p' input.txt
  • چاپ خطی که در ان عبارت test وجود دارد تا خط ۶ از فایل input.txt
sed -n '/test/,6p' input.txt
  • چاپ خط ۳ تا خطی که در آن عبارت test وجود دارد از فایل input.txt
sed -n '3,/test/p' input.txt
  • چاپ خطی که در آن عبارت test وجود دارد تا خط آخر از فایل input.txt
sed -n '/test/,$p' input.txt
  • چاپ خطی که در آن عبارت test وجود دارد و همچنین تا ۳ خط بعد از آن از فایل input.txt
sed -n '/test/,+3p' input.txt
  • چاپ خطوطی که در آن عبارت gnu و linux وجود دارد و همچنین چاپ خطوط بین این دو از فایل input.txt
sed -n '/gnu/,/linux/p' input.txt
  • پاک کردن خط سوم از فایل input.txt
sed '3d' input.txt
  • پاک کردن خط ۳ از فایل و همچین پاک کردن خطوط بعدی با فواصل ۲تایی نسبت به خط ۳ از فایل input.txt
sed '3~2d' input.txt
  • پاک کردن خط 4 و 8 و خطوط بین آن دو از فایل input.txt
sed '4,8d' input.txt
  • پاک کردن خط آخر از فایل input.txt
sed '$d' input.txt
  • پاک کرن خط ۶ و پاک کردن خط ۶ تا خط آخر از فایل input.txt
sed '6,$d' input.txt
  • پاک کردن خطی یا خطوطی که دارای عبارت test به هر نحوه در خود است از فایل input.txt
sed '/test/d' input.txt
  • نکته: فرضا خطی دارای عبارت test123 نیز باشد، پاک می شود.
  • پاک کردن خطی که حاوی عبارت test است و همچنین پاک کردن خط ۸ و همچنین پاک کردن تمام خطوط بین این دو از فایل input.txt
sed '/test/,8d' input.txt
  • پاک کردن خط ۳ و همچنین پاک کردن خطی که درون آن عبارت test قرار دارد و همچنین پاک کردن خطوط بین این دو
sed '3,/test/d' input.txt
  • پاک کردن خطی که داخل آن عبارت test است تا آخر
sed '/test/,$d' input.txt
  • پاک کردن خطی که درون آن عبارت line3 هست و همچنین تا دو خط بعد از آن از فایل input.txt
# sed '/test/,+2d' input.txt
line1
line2
line6
line7
line8
line9
line10
  • همان طور که مشاهده می کنید خط ۳ چاپ نشد و ۲ خط بعد از آن هم چاپ نشد.

  • پاک کردن خطی که عبارت gnu در آن هست و پاک کردن خطی که عبارت linux در آن است و پاک کردن خطوط بین این دو
# sed '/gnu/,/linux/d' input.txt
line7local
line8computer
line9keyboard
line10grep

  • نکته: ممکن است در درون فایل، عبارات gnu و linux چندین دفعه تکرار شده باشد. در این صورت ابزار sed اولین عبارات را در نظر گرفته و قوانین را بر روی آن اعمال می کند.

  • جایگزینی عبارت linux با Gnu-Linux در هر خط از فایل input.txt
sed 's/linux/Gnu-Linux/' input.txt 
line1gnu
line2Gnu-Linux
line3gnu
line4server
line5client
line6computer
line7local
line8computer
line9keyboard
line10grep
  • نکته قابل ذکر این است که تنها اولین کلمه در هر خط دستخوش تغییرات می باشد.
  • یعنی اگر در یک خط دو بار کلمه linux وجود داشته باشد، تنها اولین linux به Gnu-Linux تغییر پیدا می کند.

  • جایگزینی عبارت linux با # در هر خط از فایل input.txt
sed 's/linux/#/g' input.txt 
line1gnu
line2#
line3gnu
line4server
line5client
line6computer
line7local
line8computer
line9keyboard
line10grep
  • از آنجا که از حرف g به معنی Global یا کلی استفاده کردیم، تمامی linux های موجود در هر خط به کارکتر # تغییر پیدا می کنند.

  • جایگزینی دومین عبارت linux از هر خط با کارکتر #
sed 's/linux/#/2' input.txt
  • از آنجا که از عدد 2 در آخر قانون خود استفاده کردیم، لذا تنها دومین linux موجود در هر خط به کارکتر # تغییر پیدا می کند.
  • طبیعتا اگر در خطی دومین عبارت linux وجود نداشته باشد، آن خط دستخوش تغییرات نمی شود.

  • جایگزینی دومین عبارت linux به بعد از هر خط با کارکتر #
sed 's/linux/#/2g' input.txt
  • دستورات بالا تمام linux های موجود در هر خط را به جز اولین، با کارکتر # جایگزین می کند.
  • یعنی فرضا ممکن است در یک خط ۳ بار کلمه linux تکرار شده باشد. در این صورت دومین و سومین کلمه linux از آن خط دستخوش تغییرات می شود و اولین کلمه linux بدون تغییر باقی می ماند.

  • تغییر تمام linux های موجود در خط ۵ با کارکتر #
sed '5 s/linux/#/g' input.txt
  • توجه داشته باشید که فقط خط ۵ دست خوش تغییرات خواهد شد.

  • تغییر اولین linux موجود در خط ۵ به کارکتر #
sed '5 s/linux/#/p' input.txt
  • توجه داشته باشید که از سویچ n- استفاده نکردیم، لذا بقیه خطوط نیز چاپ خواهد شد.
  • توجه داشته باشید که چون از حرف p در انتهای قانون استفاده کردیم، لذا خط ۵ دو مرتبه چاپ خواهد شد.
  • معمولا زمانی که از حرف p در قانون استفاده می کنیم، سویچ n- را نیز به کار می بریم.

  • تغییر تمام linux موجود در خط ۵ به کارکتر # و چاپ تنها خط ۵
sed -n '5 s/linux/#/pg' input.txt
  • توجه داشته باشید که حرف g در قانون به منظور اعمال تغییرات بر روی کلمات linux در خط ۵ است.
  • توجه داشته باشید که حرف p در قانون به منظور چاپ خط ۵ می باشد.
  • توجه داشته باشید که سویچ n- به منظور عدم چاپ و نمایش باقی خطوط می باشد.
  • توجه داشته باشید که pg یا gp در قانون تفاوت خاصی ندارد.

  • تغییر کلیه کلمات linux با # در خط ۲ تا ۵ و خطوط بین آن
  • چاپ تنها خطوطی که دستخوش تغییرات شدند
sed -n '2,5 s/linux/#/pg' input.txt

  • تغییر کلیه کلمات linux با کارکتر # در خط ۲ تا آخر خط آخر
  • چاپ تنها خطوطی که دستخوش تغییرات شدند.
sed -n '2,$ s/linux/#/p' input.txt

  • به صورت پیشفرض ابزار sed به حروف کوچک و بزرگ حساس است.
  • در صورتی که نیاز باشد این حساسیت غیر فعال شود، از حرف I در قسمت قانون استفاده می کنیم.
  • به عنوان مثال: تغییر کلیه کلمات linux با کارکتر # در تمامی خطوط بدون حساسیت به بزرگی و کوچیکی حروف
sed 's/linux/#/Ig' input.txt
  • حرف g در قانون به منظور اعمال تغییرات بر روی کلمات linux در هر خط می باشد.

  • پیدا کردن خطوطی که در آن کارکتر – وجود دارد.
  • تغییر کارکتر – به کارکتر +
  • پاک کردن از کارکتر + تا انتهای خط
  • به عنوان نمونه فایل زیر را در نظر بگیرید :
line1-
line2- sed example
line3 - -
line4 - 4
# sed 's/-.*/+/' input.txt
line1+
line2+
line3 +
line4 +
  • به خط ۲ توجه کنید، عبارت بعد از کارکتر + تا انتهای خط پاک شده است.
  • به خط ۴ توجه کنید، عبارت بعد از کارکتر + تا انتهای خط پاک شده است.

  • پیدا کردن ۳ کارکتر آخر از هر خط
  • جایگزینی این ۳ کارکتر با عبارت SALAM
  • به عنوان نمونه فایل زیر را در نظر بگیرید :
line1-
line2- sed example
line3 - -
line4 - 4
# sed 's/...$/SALAM/' input.txt 
linSALAM
line2- sed examSALAM
line3 SALAM
line4 SALAM
  • توجه داشته باشید که عبارت $… در قسمت قانون به منزله‌ی ۳ کارکتر آخر می باشد.
  • طبیعتا می توان برای اشاره به ۲ کارکتر آخر از عبارت $.. استفاده کرد.
  • توجه داشته باشید که کارکتر $ در بخش قانون به منزله پایان خط می باشد.

  • پیدا کردن ۳ کارکتر ابتدای هر خط
  • جایگزینی این ۳ کارکتر با عبارت SALAM
  • به عنوان نمونه فایل زیر را در نظر بگیرید :
line1-
line2- sed example
line3 - -
line4 - 4
# sed 's/^.../SALAM/' input.txt 
SALAMe1-
SALAMe2- sed example
SALAMe3 - -
SALAMe4 - 4
  • توجه داشته باشید که عبارت …^ در قسمت قانون به منزله‌ی ۳ کارکتر اول خط می باشد.
  • طبیعتا می توان برای اشاره به ۲ کارکتر اول، از عبارت ..^ استفاده کرد.
  • توجه داشته باشید که کارکتر ^ در بخش قانون به منزله ابتدای خط می باشد.

  • فایل زیر را به عنوان نمونه در نظر بگیرید :
/var/www/html/
  • می خواهیم فایل بالا را به شکل زیر تبدیل کنیم :
/var/apache/files/
  • از آنجایی که در بخش قانون باید به کارکتر / اشاره کنیم، لذا کمی متفاوت باید عمل کنیم. برای این منظور :
# sed 's/www\/html/apache\/files/' input.txt
/var/apache/files/
  • sed ‘s/www\/html/apache\/files/‘ input.txt
  • همان طور که ملاحظه می کنید، برای اشاره به کارکتر / در درون قسمت قانون، به صورت /\ عمل می کنیم.

  • در مثال بالا می توان از @ یا : به جای استفاده از / استفاده کرد. به / یا @ یا : اصطلاحا delimiter گفته می شود. مطالعه بیشتر در اینجا
  • به عنوان مثال :
sed 's@www/html@apache/files' input.txt
sed 's:www/html:apache/files:' input.txt

  • فایل زیر را به عنوان نمونه در نظر بگیرید :
/var/www/html/
  • می خواهیم عبارت wordpress به انتهای عبارت /html/ اضافه شود. برای این منظور :
# sed 's:/html/:&wordpress:' input.txt 
/var/www/html/wordpress
  • به عنوان مثالی دیگر می خواهیم عبارت wordpress به انتهای عبارت /www/ اضافه شود. برای این منظور :
# sed 's:/www/:&wordpress/:' input.txt 
/var/www/wordpress/html/
  • همان طور که ملاحظه می کنید از کارکتر ampersand در بخش اسکریپت استفاده کردیم. مطالعه بیشتر در این خصوص در این لینک

  • میخواهیم بعد از خط سوم خطی جدید با مظمون test اضافه کنیم.
  • برای این منظور :
# sed '3 a \test' input.txt 
line1
line2
line3
test
line4
  • حرف a در بخش اسکریپت به منظور اضافه کردن یا append می باشد.

  • می خواهیم به دنبال یک رشته بگردیم
  • سپس بعد از آن خطی جدید با مضمونی خاص اضافه کنیم.
# sed '/line2/a\L i n u x' input.txt
line1
line2
L i n u x
line3
line4
  • در صورتی که در فایل ورودی، چندین عبارت line2 پیدا شود، زیر تک تک خطوط آن کلمه L i n u x نوشته می شود. (append می شود)

  • می خواهیم بعد از هر خط یک خط خالی اضافه کنیم.
  • برای این منظور :
# sed '/$/a\\' input.txt 
line1

line2

line3

line4

  • می خواهیم بعد از هر خط، یک خط با محتوای New_Line اضافه کنیم. برای این منظور :
# sed '/$/a\New_Line' input.txt 
line1
New_Line
line2
New_Line
line3
New_Line
line4
New_Line

  • اضافه کردن عبارت LAST_LINE بعد از آخرین خط از فایل :
# sed '$ a\LAST_LINE' input.txt

  • اضافه کردن عبارت test بعد از هر خط، از خط چهارم تا آخرین خط
# sed '4,$ a\test' input.txt
  • اضافه کردن خط جدید بر روی خط ۴ نیز اعمال خواهد شد.

  • اضافه کردن عبارت TEST قبل از خط سوم
# sed '3 i\TEST' input.txt 
line1
line2
TEST
line3
line4
  • از فرمان i به منظور اضافه کردن قبل از یا Insert استفاده می شود.

  • اضافه کردن عبارت TEST قبل از خط یا خطی هایی که حاوی عبارت line4 باشند.
sed '/line4/ i\TEST' input.txt 
line1
line2
line3
TEST
line4
  • نکته: ممکن است چندین خط حاوی عبارت line4 باشد، لذا عبارت TEST قبل از تمام خطوط آنان اضافه می شود.

  • اضافه کردن عبارت ——- قبل از تمامی خطوط موجود در فایل.
# sed '/$/ i\-------' input.txt 
-------
line1
-------
line2
-------
line3
-------
line4

  • اضافه کردن عبارت ——- قبل از آخرین خط موجود در فایل.
# sed '$ i\-------' input.txt 
line1
line2
line3
-------
line4

  • اضافه کردن کارکتر # قبل از خط ۳ تا آخرین خط موجود در فایل.
# sed '3,$ i\#' input.txt 
line1
line2
#
line3
#
line4
  • نکته: همان طور که مشاهده می کنید، کارکتر # قبل از خط ۳ نیز اضافه شده است.

  • پاک کردن خطی مشخص بر اساس شماره خط
  • و جایگزینی آن خط با عبارت یا جمله ای مشخص
# sed '2 c\This is LINE_2' input.txt 
line1
This is LINE_2
line3
line4
  • استفاده از فرمان c در بخش اسکریپت به معنی جایگزینی و تغییر است.

  • پاک کردن خط یا خط هایی که حاوی عبارت line هستند
  • و جایگزینی آن خط با عبارت یا جمله ای مشخص
# sed '/line/c\This is a line' input.txt 
This is a line
This is a line
This is a line
This is a line
  • همان طور که ملاحظه می کنید، تمام خطوط دستخوش تغییرات شدند چرا که عبارت line در تمام خطوط وجود داشت.

  • پاک کردن خط پایانی از فایل ورودی
  • و جایگزینی آن را عبارت یا جمله ای مشخص
# sed '$ c\Last Line' input.txt 
line1
line2
line3
Last Line
  • همان طور که مشاهده می کنید خط آخر یعنی خط چهارم پاک شد سپس با عبارت Last Line جایگزین شد.

  • پاک کردن از خط دوم تا خط آخر
  • و جایگزینی آن خطوط با تنها عبارت یا جمله ای مشخص
# sed '2,$ c\$' input.txt 
line1
$
  • نکته: دستور بالا باعث شد تا خطوط دوم، سوم و چهارم پاک شوند و تنها خطی با مضمون $ جایگزین آنان شود.

  • پاک کردن تک تک خطوط فایل
  • و جایگزینی عبارت یا جمله ای مشخص با تک تک خطوط
# sed '/$/ c\linux' input.txt
linux
linux
linux
linux
  • همان طور که ملاحظه می کنید، تمام خطوط با عبارت linux جایگزین شدند.

  • چاپ کردن شماره خطوط هر خط
# sed '=' input.txt 
1
line1
2
line2
3
line3
4
line4
  • همان طور که ملاحظه می کنید، شماره هر خط در خط قبلی آن مشخص شده است.

  • پیدا کردن شماره خطی که حاوی عبارتی خاص است :
# sed '/line3/=' input.txt 
line1
line2
3
line3
line4
  • همان طور که مشاهده می کنید به دنبال عبارت line3 گشتیم و شماره خط آن در قسمت خروجی مشخص شده است.
  • برای چاپ نشدن خروجی پیش فرض pattern space یا pattern buffer از سویچ n- استفاده می کنیم :
# sed -n '/line3/=' input.txt 
3
  • ممکن است دنبال عبارتی بگردیم که در چندین خط وجود داشته باشد، در این صورت شماره خط تمامی ان خطوط نمایش داده می شود.

  • چاپ شماره خطوط دو عبارت خاص و جدا از هم
  • و چاپ شماره خطوط بین خطی که حاوی این دو عبارت هستند.
# sed -n '/line2/,/line4/=' input.txt 
2
3
4
  • همان طور که مشاهده می کنید شماره خطوطی که حاوی عبارت line2 و line4 بود نمایش داده شد و همچنین شماره خطوطی که بین این دو هستند نیز نمایش داده شد.
  • نکته: با توجه به مثال بالا، ممکن است چندین خطوط وجود داشته باشد که حاوی عبارت line2 یا line4 باشند. در این صورت اولیوت و همیشه به اولین یافته است.
  • به عنوان مثال فایل زیر را در نظر بگیرید :
line1
line1
line2
line2
line3
line4
line4
# sed -n '/line2/,/line4/=' input.txt 
3
4
5
6
  • همان طور که مشاهده می کنید خروجی از خط 3 یعنی اولین یافته‌ی line2 و تا خط 6 یعنی اولین یافته‌ی line4 نمایش داده شده است.

  • پیدا کردن شماره‌ی آخرین خط از فایل ورودی
# sed -n '$ =' input.txt 
7
  • فایل فرض دارای 7 خط بود که با دستور بالا شماره خط آخرین خط نمایش داده شد.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


نکات

  • در مثال های بالا گفته شد که فرضا خط سوم چاپ شود، باید توجه شود که منظور از خط سوم فقط خطی که دارای عبارات یا کلمات یا کارکتر باشد نیست، بلکه خطوط خالی نیز به عنوان خط حساب و شمرده می شوند.

sed -n '3p' input # print only line3
sed -n '1~2p' input # print lines
sed -n '2,7p' input # print line2 until line7
sed -n '$p' input # print only last line
sed -n '3,$p' input # print line3 until last line

sed -n -f sed.script input # load sed rules from file
cat input | sed -n -f sed.script # load sed rules from file
sed -n -f sed.script < input # load sed rules from file

sed -n '/Databases/p' input # print line
sed -n '/Databases/,6p' input # print database line until line6
sed -n '3,/Security/p' input # print line3 until security line
sed -n '/Cool/,$p' input # print Cool line until last line
sed -n '/Storage/,+3p' input # print Storage line and 3line after than
sed -n '/Databases/,/Storage/p' input # print Database line until Storage line

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *