دوستان و علاقمندان به مباحث آموزش یونیکس (UNIX) ، این آموزش را از سایت پی وی لرن دنبال خواهیم نمود. Regular Expression با SED در یونیکس (UNIX) را در این بخش نیز ادامه خواهیم داد. بنابراین مباحثی چون دستور Substitution در یونیکس ، فلگ های جایگزینی (Substitution)، استفاده از جداکننده رشته جایگزین و غیره را داریم.
دستور Substitution ، هر رشته ای را که مشخص می کنید را با هر رشته دیگری که مشخص کرده اید، جایگزین می کند.
برای Substitution کردن یک رشته با رشته دیگر ، sed باید اطلاعاتی مربوط به جایی که رشته اول به پایان می رسد و رشته جایگزین شروع می شود، داشته باشد. برای این کار ، با رزرو دو رشته با کاراکتر slash (/) ، اقدام می کنیم.
دستور زیر اولین وقایع را در یک خط string root با رشته amrood جایگزین می کند.
1 2 3 4 | $ cat /etc/passwd | sed 's/root/amrood/' amrood:x:0:0:root user:/root:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh .......................... |
ذکر این نکته بسیار حائز اهمیت است که sed فقط اولین رخداد را در یک خط جایگزین می کند. اگر string root بیش از یک بار در یک خط رخ دهد ، فقط تطبیق اول جایگزین می شود.
برای این که sed جایگزینی عمومی را انجام دهد، حرف g را در انتهای دستور به شرح زیر اضافه کنید.
1 2 3 4 5 6 | $ cat /etc/passwd | sed 's/root/amrood/g' amrood:x:0:0:amrood user:/amrood:/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 ........................... |
تعدادی فلگ مفید دیگر نیز وجود دارد که می توان علاوه بر فلگ g از آن استفاده کرد و همچنینی می توانید به طور همزمان بیش از یک مورد را مشخص کنید.
ردیف | فلگ و شرح |
---|---|
۱ | g همه تطابق ها (match) را جایگزین می کند ، نه تنها تطبیق (match) اول را. |
۲ | NUMBER فقط تطبیق NUMBERth جایگزین می کند. |
۳ | p اگر جایگزینی ایجاد شود ، فضای الگو (pattern space) را چاپ می کند. |
۴ | w FILENAME اگر جایگزینی انجام شد ، نتیجه را برای FILENAME می نویسد. |
۵ | I or i match ها به صورت غیرقابل حساس به حروف بزرگ و کوچک است |
۶ | M or m این فلگ علاوه بر رفتار عادی کاراکترهای regular expression خاص ^ و $ ، این فلگ باعث می شود ^ رشته های خالی را بعد از یک خط جدید match کند و $ رشته های خالی را قبل از خط جدید match کند. |
فرض کنید شما باید جایگزینی رشته ای که شامل کاراکتر slash رو به جلو است، را انجام دهید. در این حالت می توانید با تهیه کاراکتر مشخص شده پس از s ، جداکننده دیگری را تعیین کنید.
1 2 3 | $ cat /etc/passwd | sed 's:/root:/amrood:g' amrood:x:0:0:amrood user:/amrood:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh |
در مثال بالا ، : را به عنوان جدا کننده به جای اسلش / استفاده کرده ایم، به دلیل این که سعی می کنیم به جای root/ ، ریشه (root) ساده جستجو کنیم.
برای حذف رشته اصلی از فایل etc / passwd/ از رشته جایگزینی خالی (empty substitution string) استفاده کنید.
1 2 3 | $ cat /etc/passwd | sed 's/root//g' :x:0:0::/:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh |
اگر می خواهید رشته sh را فقط با رشته quiet در خط ۱۰ جایگزین کنید ، می توانید آن را به شرح زیر مشخص کنید.
1 2 3 4 5 6 7 8 9 10 11 | $ cat /etc/passwd | sed '10s/sh/quiet/g' 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/quiet |
به طور مشابه ، برای انجام جایگزینی دامنه آدرس ، می توانید کاری مانند موارد زیر را انجام دهید.
1 2 3 4 5 6 7 8 9 10 11 | $ cat /etc/passwd | sed '1,5s/sh/quiet/g' root:x:0:0:root user:/root:/bin/quiet daemon:x:1:1:daemon:/usr/sbin:/bin/quiet bin:x:2:2:bin:/bin:/bin/quiet sys:x:3:3:sys:/dev:/bin/quiet 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 به quiet تغییر پیدا کرده است ، اما بقیه خطوط دست نخورده باقی مانده اند.
در این بخش از آموزش یونیکس و مبحث Regular Expression با SED در یونیکس ، جایگزینی با فاصله خالی، دستور Substitution در یونیکس ، فلگ های جایگزینی (Substitution) و غیره را مورد بحث قرار دادیم. در بخش بعدی نیز این مبحث را ادامه خواهیم داد.