دوستان و علاقمندان به مباحث آموزش یونیکس (UNIX) ، این آموزش را از سایت پی وی لرن دنبال خواهیم نمود. در بخش آخر بررسی Regular Expression با SED در یونیکس (UNIX) به بررسی دستور Matching، استفاده از چندین دستور sed در یونیکس ، اشاره به & ، کاراکترهاي تطبیق (Matching Characters) ، کلمات کلیدی Character Class و غیره می پردازیم. با ادامه ی آموزش یونیکس همرا ما باشید.
شما می توانید از گزینه p به همراه گزینه n- برای چاپ تمام خطوط مطابق به شرح زیر استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ cat testing | sed -n '/root/p' root:x:0:0:root user:/root:/bin/sh [root@ip-72-167-112-17 amrood]# vi testing root:x:0:0:root user:/root:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh |
در حین تطبیق الگوها ، می توانید از عبارت Regular استفاده کنید که انعطاف پذیری بیش تری را ارائه می دهد.
مثال زیر را بررسی کنید که تمام خطوط که شروع با Daemon را مطابقت می دهد و سپس آن ها را حذف می کند.
1 2 3 4 5 6 7 8 9 10 | $ cat testing | sed '/^daemon/d' root:x:0:0:root user:/root:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh |
در زیر مثالی وجود دارد که تمام خطوط منتهی به sh را حذف می کند.
1 2 | $ cat testing | sed '/sh$/d' sync:x:4:65534:sync:/bin:/bin/sync |
در جدول زیر چهار کاراکتر خاص آورده شده است که در عبارات منظم بسیار مفید هستند.
ردیف | کاراکتر و شرح |
---|---|
۱ | ^ با شروع خطوط مطابقت دارد.
|
۲ | $ با پایان خطوط مطابقت دارد.
|
۳ | . با هر کاراکتر واحد مطابقت دارد
|
۴ | * وقایع صفر یا بیش تر از کاراکتر قبلی را مطابقت می دهد.
|
۵ | [chars] با هر کدام از کاراکترهای داده شده در chars مطابقت دارد ، جایی که char ها دنباله ای از کاراکترها هستند. برای نشان دادن طیف وسیعی از کاراکترها می توانید از کاراکتر – استفاده کنید. |
به چند عبارت دیگر نگاهی می اندازیم تا کاربرد متاکاراکترها را نشان دهیم. به عنوان مثال ، الگوی زیر را بررسی می کنیم.
ردیف | عبارت و توضیحات |
---|---|
۱ | /a.c/ خطوطی را شامل رشته هایی مانند a + c ، a-c ، abc و a3c است، مطابقت می دهد.
|
۲ | /a*c/ همان رشته ها را به همراه رشته هایی مانند ace, yacc و arctic مطابقت می دهد.
|
۳ | /[tT]he/ رشته ی The و the را مطابقت می دهد.
|
۴ | /^$/ خطوط خالی را مطابقت می دهد.
|
۵ | /^.*$/ یک خط کامل را مطابقت می دهد.
|
۶ | / */ یک یا چند فاصله را مطابقت می دهد.
|
۷ | /^$/ خطوط خالی (blank) را مطابقت می دهد. |
جدول زیر تعدادی از کاراکترهای متداول را نشان می دهد.
ردیف | تنظیم و توضیحات |
---|---|
۱ | [a-z] حرف کوچک تکی را تطبیق مى دهد.
|
۲ | [A-Z] حرف بزرگ تکی را تطبیق مى دهد.
|
۳ | [a-zA-Z] با یک حرف واحد مطابقت دارد.
|
۴ | [۰-۹] با یک عدد مطابقت دارد.
|
۵ | [a-zA-Z0-9] یک حرف یا عدد واحد را تطبیق مى دهد. |
در ادامه ی مبحث بررسی Regular Expression با SED در یونیکس ، با کلمات کلیدی Character Class آشنا می شویم.
برخی از کلمات کلیدی ویژه معمولاً برای regexps ، به خصوص ابزارهای GNU که از regexps استفاده می کنند ، در دسترس هستند. این ها برای عبارات regular بسیار مفید هستند زیرا چیزها را ساده می کنند و خوانایی را بالا می برند.
کاراکترهای a تا z و کاراکترهای A تا Z ، یک کلاس از جمله، کاراکترها را تشکیل می دهند که دارای کلمه کلیدی [[: alpha:]] هستند.
با استفاده از کلید واژه alphabet character class ، این دستور فقط آن خطوط را در فایل etc/syslog.conf/ که با یک حرف از الفبا شروع می شود، چاپ می کند.
1 2 3 4 5 6 | $ cat /etc/syslog.conf | sed -n '/^[[:alpha:]]/p' authpriv.* /var/log/secure mail.* -/var/log/maillog cron.* /var/log/cron uucp,news.crit /var/log/spooler local7.* /var/log/boot.log |
جدول زیر لیستی کامل از کلمات کلیدی Character Class موجود در GNU sed آمده است.
ردیف | Character Class و شرح |
---|---|
۱ | [[:alnum:]] [Alphanumeric [a-z A-Z 0-9
|
۲ | [[:alpha:]] الفبایی [a-z A-Z] |
۳ | [[:blank:]] کاراکترهای خالی (فاصله یا تب)
|
۴ | [[:cntrl:]] کاراکترهای کنترل
|
۵ | [[:digit:]] عددها [۰-۹]
|
۶ | [[:graph:]] هر کاراکتر قابل مشاهده (به استثنای فضای سفید)
|
۷ | [[:lower:]] حروف کوچک [a-z]
|
۸ | [[:print:]] کاراکترهای قابل چاپ (کاراکترهای غیر کنترلی)
|
۹ | [[:punct:]] علائم نگارشی
|
۱۰ | [[:space:]] فضای سفید
|
۱۱ | [[:upper:]] حروف بزرگ [A-Z]
|
۱۲ | [[:xdigit:]] رقم های هگز [۰-۹ a-f A-F] |
sed metacharacter & محتوای الگویی را که مطابقت دارد نشان می دهد. به عنوان مثال ، می گویند فایلی دارید به نام phone.txt پر از شماره تلفن ها ، مانند موارد زیر:
1 2 3 4 5 6 | 5555551212 5555551213 5555551214 6665551215 6665551216 7775551217 |
شما می توانید برای خواندن آسان تر کد منطقه (سه رقم اول) را که توسط پرانتز احاطه شده است ، تهیه کنید. برای این کار می توانید از کاراکتر جایگزین & استفاده کنید.
1 2 3 4 5 6 7 8 | $ sed -e 's/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g' phone.txt (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 (777)5551217 |
در قسمت الگو، ۳ رقم اول را مطابقت می دهید و سپس از & استفاده می کنید، و آن ۳ رقم را با & جایگزین می کنید.
بررسی Regular Expression با SED در یونیکس را با مبحث استفاده از چندین دستور sed در یونیکس ادامه می دهیم.
شما می توانید چندین دستور sed در یک دستور واحد sed به شرح زیر استفاده کنید.
1 | $ sed -e 'command1' -e 'command2' ... -e 'commandN' files |
در این جا command1 از طریق commandN دستورات sed از نوع مورد بحث در گذشته هستند. این دستورات برای هر یک از سطرهای موجود در لیست فایل های داده شده توسط فایل ها اعمال می شود.
با استفاده از همین ساز و کار ، می توانیم مثال شماره تلفن فوق را به شرح زیر بنویسیم.
1 2 3 4 5 6 7 8 | $ sed -e 's/^[[:digit:]]\{3\}/(&)/g' \ -e 's/)[[:digit:]]\{3\}/&-/g' phone.txt (555)555-1212 (555)555-1213 (555)555-1214 (666)555-1215 (666)555-1216 (777)555-1217 |
توجه – در مثال بالا ، به جای تکرار کلمه کلیدی class کاراکتر [[:digit:]] سه بار ، ما آن را با {۳\}\ جایگزین کردیم ، به این معنی که عبارت منظم قبلی سه بار مطابقت پیدا کرده. ما همچنین از \ برای شکستن خط استفاده کرده ایم و باید قبل از اجرای دستور حذف شود.
در ادامه ی مبحث استفاده از چندین دستور sed در یونیکس Back References را داریم.
متاکاراکتر & مفید است ، اما حتی تعریف مفیدتر، توانایی تعریف مناطق خاص (specific regions) در regular expressions است. این مناطق ویژه می توانند به عنوان مرجعی در رشته های جایگزینی شما استفاده شوند. با تعریف قسمت های خاصی از یک regular expressions، می توانید دوباره به آن قسمت ها با کاراکتر مرجع خاص مراجعه کنید.
برای انجام back references ، ابتدا باید یک منطقه را تعریف کرده و به آن منطقه اشاره کنید. برای تعریف یک منطقه ، پرانتزهای backslashed را در اطراف هر منطقه مورد علاقه خود وارد می کنید. اولین منطقه ای که شما با استفاده از backslash ها احاطه کرده اید ، پس از اشاره توسط ۱ \ ، منطقه دوم توسط ۲ \ و موارد دیگر است.
با فرض phone.txt متن زیر وجود دارد.
1 2 3 4 5 6 | (555)555-1212 (555)555-1213 (555)555-1214 (666)555-1215 (666)555-1216 (777)555-1217 |
دستور زیر را امتحان کنید.
1 2 3 4 5 6 7 8 | $ cat phone.txt | sed 's/\(.*)\)\(.*-\)\(.*$\)/Area \ code: \1 Second: \2 Third: \3/' Area code: (555) Second: 555- Third: 1212 Area code: (555) Second: 555- Third: 1213 Area code: (555) Second: 555- Third: 1214 Area code: (666) Second: 555- Third: 1215 Area code: (666) Second: 555- Third: 1216 Area code: (777) Second: 555- Third: 1217 |
توجه – در مثال بالا ، هر عبارت منظم در داخل پرانتز با استفاده از ۱ \ ، ۲ \ و موارد دیگر باز خواهد گشت. ما در این جا از \ \ استفاده کرده ایم. این باید قبل از اجرای دستور حذف شود.
بررسی Regular Expression با SED در یونیکس را در این جا به پایان می رسانیم.
بررسی Regular Expression با SED در یونیکس را با بحث در مورد استفاده از چندین دستور sed در یونیکس ، دستور Matching، استفاده از چندین دستور sed در یونیکس ، اشاره به & ، کاراکترهاي تطبیق (Matching Characters) ، کلمات کلیدی Character Class و غیره ادامه دادیم. در جلسه ی آینده به بررسی File System Basics می پردازیم. با آموزش یونیکس از وب سایت پی وی لرن همراه باشید.