صفحه نخست | سیستم وبلاگ | در مورد من | twitter
$ 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 کلیه خطوط خروجی را شمارهگذاری میکنیم.
$ 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 را در ادامه بررسی میکنیم.
توجه کنید که توضیحات مربوط به هر مثال را بعد از حل مساله در زیر آن آوردهایم.
$ 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
$ 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
برای بررسی صحت عملکرد دستور به کاراکترهای پایان هر خط توجه کنید .
$ 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 آن را بررسی میکنیم.
$ 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 را خروجی استاندارد چاپ میکند. پس نتیجه اجرای دستور به این صورت در میآید که یک خط شماره خط و خط دیگر محتوای خط نمایش داده میشود و به همین صورت تا انتهای فایل. برای فهم دقیق مساله به خروجی مثال بالا توجه کنید.
حال مساله کامل را بررسی میکنیم:
$ sed '=' data.txt | sed 'N;s/\n/\t/'
بخش اول دستور بالا قبل از pipe، همان است که در خروجی آن را دیدیم که این بار خروجی خود را در pipe میریزد و sed دوم هم ورودی خود را به جای خواندن از فایل اینبار از pipe میخواند. دستور N در sed دوم خط بعدی را میخواند و به pattern space اضافه میکند و دستور s کاراکتر n\ موجود بین دو خط حاضر در pattern space را به کاراکتر t\ یعنی همان tab عوض میکند.
$ 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
$ sed -n '$ =' data.txt 14
$ 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 با هم مقایسه میکنیم.
$ 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 میباشد و نه برابری تعداد کاراکترهای دو فایل!
$ echo 1648195 | sed ':a s/\(.*[0-9]\)\([0-9]\{3,\}\)/,/;ta' 1,648,195
دستور t که ابتدای کلمه test میباشد به این معناست که چنانچه آخرین دستور s محتوای pattern space را تغییر داده باشد کنترل را به label داده شده در جلوی t منتقل میکند. در صورت عدم وجود label کنترل به انتهای دستورات sed منتقل میشود.
$ 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
$ 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
$ 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
کلیه حقوق برای دارندهی سایت محفوظ است.