ورود به سایت

لطفا با نام کاربری و کلمه عبور وارد سایت شوید.

ثبت نام ×

لطفا فرم را پر کرده و ثبت نام کنید!

پنجاه مثال تک خطی sed - بخش دوم

بخش دوم دستورات تک خطی sed با ۱۰ مثال پیش روی شماست. در این بخش، دستورات داده شده اکثرا بر روی فایل data.txt با محتوای زیر اعمال می‌شوند.

Bash
$ cat data.txt
 
 
      This is line number: #3. line 1 and 2 is empty
This is line number: #4
                   This is line number: #5
           This is line number: #6
This is line number: #7
 
        This is line number: #9     
This is line number: #10
 
 
This is line number: #13 . Note that line number 14 is empty

برای بررسی دقیق فایل بالا و اطلاع از خطوط خالی و تعداد خط‌ها با استفاده از دستور sed ابتدا و انتهای هر خط را با علامتهای > و < مشخص کرده و سپس با دستور nl کلیه خطوط خروجی را شماره‌گذاری می‌کنیم.

Bash
$ sed 's/^/</;s/$/>/' data.txt | nl -ba
     1	<>
     2	<>
     3	<      This is line number: #3. line 1 and 2 is empty>
     4	<This is line number: #4>
     5	<                   This is line number: #5>
     6	<           This is line number: #6>
     7	<This is line number: #7>
     8	<>
     9	<        This is line number: #9     >
    10	<This is line number: #10>
    11	<>
    12	<>
    13	<This is line number: #13 . Note that line number 14 is empty>
    14	<>

همان‌گونه که مشاهده می‌کنید خط ۱ و ۲ در ابتدای فایل و همچنین خط ۱۴ در انتهای فایل خالی می‌باشند. خطوط ۸ و ۱۱ و ۱۲ نیز خالی می‌باشند. خطوط ۳ و ۵ و ۶ و ۹ با کاراکترهای space شروع می‌شوند و خط ۹ نیز به تعدادی کاراکتر space ختم می‌شود. حال که ساختار فایل ورودی به صورت شفاف شناخته شد، مثال‌هایی از دستور sed را در ادامه بررسی می‌کنیم.

توجه کنید که توضیحات مربوط به هر مثال را بعد از حل مساله در زیر آن آورده‌ایم.

مثال 1)کلیه خطوط خالی را حذف کنید.

Bash
$ sed '/^$/ d' data.txt
      This is line number: #3. line 1 and 2 is empty
This is line number: #4
                   This is line number: #5
           This is line number: #6
This is line number: #7
        This is line number: #9     
This is line number: #10
This is line number: #13 . Note that line number 14 is empty

مثال 2) خط‌های خالی را حذف کنید و آخرین کاراکتر هر خط غیر خالی را پاک کنید.

Bash
$ sed '/^$/ d;s/.$//' data.txt
      This is line number: #3. line 1 and 2 is empt
This is line number: #
                   This is line number: #
           This is line number: #
This is line number: #
        This is line number: #9    
This is line number: #1
This is line number: #13 . Note that line number 14 is empt

برای بررسی صحت عملکرد دستور به کاراکترهای پایان هر خط توجه کنید .

مثال 3) شماره هر خط را در سمت چپ همان خط نمایش دهید.

Bash
$ sed '=' data.txt | sed 'N;s/\n/\t/'
1	
2	
3	      This is line number: #3. line 1 and 2 is empty
4	This is line number: #4
5	                   This is line number: #5
6	           This is line number: #6
7	This is line number: #7
8	
9	        This is line number: #9     
10	This is line number: #10
11	
12	
13	This is line number: #13 . Note that line number 14 is empty
14

در مثال فوق دو بار sed را استفاده کرده‌ایم. دستور = که جز دستورات sed است شماره خط فعلی را به اضافه‌ی یک کاراکتر n\ یا new line در خروجی استاندارد می‌نویسد. برای اطلاع توجه داشته باشید که دستور = علی رغم استفاده از سوییچ n- باز هم شماره خط را در خروجی استاندارد می‌نویسد و یا به عبارت دیگر سوییچ n- تاثیری بر روی عملکرد دستور = ندارد. برای فهم دقیق دستور بالا ابتدا فقط قسمت اول دستور یا قسمت قبل از pipe آن را بررسی می‌کنیم.

Bash
$ sed '=' data.txt
1
 
2
 
3
      This is line number: #3. line 1 and 2 is empty
4
This is line number: #4
5
                   This is line number: #5
6
           This is line number: #6
7
This is line number: #7
8
 
9
        This is line number: #9     
10
This is line number: #10
11
 
12
 
13
This is line number: #13 . Note that line number 14 is empty
14

همان‌طور که مشاهده می‌کنید دستور = شماره خط را در خروجی استاندارد می‌نویسد و سپس یک کاراکتر n\ چاپ می‌کند. از طرف دیگر sed به صورت خودکار بعد از اجرای تمام دستورات در یک سیکل، محتوای pattern space را خروجی استاندارد چاپ می‌کند. پس نتیجه اجرای دستور به این صورت در می‌آید که یک خط شماره خط و خط دیگر محتوای خط نمایش داده می‌شود و به همین صورت تا انتهای فایل. برای فهم دقیق مساله به خروجی مثال بالا توجه کنید.

حال مساله کامل را بررسی می‌کنیم:

Bash
$ sed '=' data.txt | sed 'N;s/\n/\t/'

بخش اول دستور بالا قبل از pipe، همان است که در خروجی آن را دیدیم که این بار خروجی خود را در pipe می‌ریزد و sed دوم هم ورودی خود را به جای خواندن از فایل این‌بار از pipe می‌خواند. دستور N در sed دوم خط بعدی را می‌خواند و به pattern space اضافه می‌کند و دستور s کاراکتر n\ موجود بین دو خط حاضر در pattern space را به کاراکتر t\ یعنی همان tab عوض می‌کند.

مثال 4) شماره هر خط غیر خالی را در سمت چپ آن قرار دهید.

Bash
$ sed '/./ =' data.txt | sed '/./ {N;s/\n/\t/;}'
 
 
3	      This is line number: #3. line 1 and 2 is empty
4	This is line number: #4
5	                   This is line number: #5
6	           This is line number: #6
7	This is line number: #7
 
9	        This is line number: #9     
10	This is line number: #10
 
 
13	This is line number: #13 . Note that line number 14 is empty

مثال 5) تعداد کل خط‌های یک فایل را برگردانید. (مشابه دستور wc -l)

Bash
$ sed -n '$ =' data.txt
14

مثال 6) دستور nl -ba را به صورت دقیق با sed پیاده‌سازی کنید.
Bash
$  sed '=' data.txt  | sed 'N;s/^/     /;s/ *\(.\{6,\}\)\n/\t/'
     1	
     2	
     3	      This is line number: #3. line 1 and 2 is empty
     4	This is line number: #4
     5	                   This is line number: #5
     6	           This is line number: #6
     7	This is line number: #7
     8	
     9	        This is line number: #9     
    10	This is line number: #10
    11	
    12	
    13	This is line number: #13 . Note that line number 14 is empty
    14

برای بررسی صحت عملکرد، خروجی این دستور و نیز خروجی دستور nl -ba را با استفاده از diff و همچنین ls -l با هم مقایسه می‌کنیم.

Bash
$ nl -ba data.txt >data.txt.nl
$ sed '=' data.txt  | sed 'N;s/^/     /;s/ *\(.\{6,\}\)\n/\t/' >data.txt.sed
$ diff data.txt.nl data.txt.sed
$ ls -l data.txt.*
-rw-rw-r-- 1 mohsen mohsen 406 Jan 29 19:32 data.txt.nl
-rw-rw-r-- 1 mohsen mohsen 406 Jan 29 19:32 data.txt.sed

همان‌طور که مشاهده می‌کنید دستور diff هیچ گونه اختلافی را نشان نمی‌دهد و دستور ls هم موید تعداد دقیق کاراکترهای دو فایل است که البته ملاک اصلی یکسان بودن دو فایل، دستور diff می‌باشد و نه برابری تعداد کاراکترهای دو فایل!

مثال 7) عدد ۱۶۴۸۱۹۵ و یا به طور کلی هر عدد را سه رقم سه رقم با , از هم جدا کنید.

Bash
$ echo 1648195 | sed ':a s/\(.*[0-9]\)\([0-9]\{3,\}\)/,/;ta'
1,648,195

دستور t که ابتدای کلمه test می‌باشد به این معناست که چنانچه آخرین دستور s محتوای pattern space را تغییر داده باشد کنترل را به label داده شده در جلوی t منتقل می‌کند. در صورت عدم وجود label کنترل به انتهای دستورات sed منتقل می‌شود.

مثال 8) کلیه خطوط را در فضای ۷۹ کاراکتری راست چین کنید.

Bash
$ sed ':a s/^.\{1,78\}$/ &/; ta' data.txt
 
 
                                 This is line number: #3. line 1 and 2 is empty
                                                        This is line number: #4
                                                        This is line number: #5
                                                        This is line number: #6
                                                        This is line number: #7
 
                                                   This is line number: #9     
                                                       This is line number: #10
 
 
                   This is line number: #13 . Note that line number 14 is empty

مثال 9) کلیه خطوط را در فضای ۷۹ کاراکتری وسط چین کنید.

Bash
$ sed ':a s/^.\{1,77\}$/ & /; ta' data.txt
 
 
                   This is line number: #3. line 1 and 2 is empty             
                            This is line number: #4                            
                                     This is line number: #5                  
                                 This is line number: #6                      
                            This is line number: #7                            
 
                             This is line number: #9                          
                           This is line number: #10                           
 
 
         This is line number: #13 . Note that line number 14 is empty

مثال 10) هر خط را با خط بعدی یکی کرده و با یک فاصله از هم جدا کنید.

Bash
$ sed 'N;s/\n/ /' data.txt
 
      This is line number: #3. line 1 and 2 is empty This is line number: #4
                   This is line number: #5            This is line number: #6
This is line number: #7 
        This is line number: #9      This is line number: #10
 
This is line number: #13 . Note that line number 14 is empty

مطالب مرتبط


نظر شما



 
 
 
لینک‌های مفید