اگر قادر نیستی خود را بالا ببری ،همانند سیب باش تا با افتادنت اندیشه ای بالا برود.
![]() جستجوی متن در عبارتpid یعنی پروسس ای دی. هر برنامه ای در لینوکس با یه پروسس ای دی کار می کنه. برای از کار انداختنش باید یه دستور kill -9 قبلش زد مثلا اگه یه pid داریم به شماره 1234 با دستور kill -9 1234 اون پروسس رو از کار می اندازیم. حالا فرض کن یه برنامه داریم که حدودا می دونیم با چه اسمی می اد ولی نمی دونیم شماره پردازشش چیه. چزوری می شه فهمید؟ خوب اول می ریم با دستور ps -A لیست کل پردازشها رو می بینیم بعد با grep کردن پروسس ای دی اش را در می اوریم مثلا داریم ps -A | grep 'saeed
حالا اگه بخواهیم دقیق تر و ریز تر بشویم می توانیم از کامند sed و cut استفاده کنیم که کاربرد های خوبی دارد cut برای بریدن یک زیر رشته از رشته کاربرد دارد مثلا ps -A | grep 'saeed' | cut -c2-6 یعنی از خروجی grep از کارکتر دوم تا 6 را ببر و جدا کن مثلا اگر خروجی grep برابر عبارت 1234 saeed 888888 باشد خروجی برابر 234 s خواهد بود.( یه خورده تو این ادیتور میهن بلاگ بهم می ریزه. امیدوارم متوجه بشید) از اون باحال تر دستور sed است. با دستور sed می توانید یک رشته را در رشته دیگر جستجو کنید و یا در خروجی تغییرات ایجاد کنید. دستور sed راباید بخونید. یه متن خوب براش می زارم توی ادامه مطلب. ولی مثلا باید حتما با یک کوتیشن و یک s شروع شود و به جاهای خوب برسید. از regular expersion هم می تونید استفاده کنید. من می خواستم توی رشته ام در صورتیکه به عدد خورد بین ان و قسمت بعدی فاصله بیندازد. و بعدش هم می خواستم در صورتیکه حرف توش نبود از ان استفاده کند. لذا کامند های زیر را زدم راستی با کامند Echo `` انرا فرستادم توی فایل. خیلی حال داد. echo kill -9 ` ps -A | gerp 'saeed' | sed 's/[0-9]*/& /' | cut -c1-8 | sed 's_[^0-9]_ _g'` > /tmp/killer.sh لازم به ذکر است که در دستور Sed می توان از / یا _ و یا : و غیره بعنوان جدا کننده استفاده کرد. همین منابع: https://alvinalexander.com/linux-unix/linux-cut-command-cut-fields-columns-examples http://wiki.linuxreview.ir/Shell-scripting-tutorial/chapter17 دستور sedsed یک ویرایشگر ویژه برای ویرایش خودکار فایل است. اگر شما قصد دارید اسکریپتی بنویسید تا فایلی را ویرایش کنید، sed ابزاری است که برای این منظور می توانید از آن استفاده کنید. درواقع sed یک ویرایشگر جریان (Stream editor) است. اگر با این مفهوم ارتباط برقرار نمی کنید، کاری که با لوله کشی (Piping) می کنید را تصور کنید.
دستورات اصلی s برای جانشینی (substitution)sed آپشنهای زیادی دارد ولی اکثرا تنها آپشن s را می شناسند و استفاده می کنند. s تمامی بخش هایی که با الگو مورد نظر همخوانی دارد را با مقدار جدید جایگزین می کند. در مثال زیر کلمه day در فایل old با کلمه night جایگزین می شود و نتیجه در فایل new ذخیره می شود: sed s/day/night/ <old >new یا روش دیگر: sed s/day/night/ old >new یا میتوانید این روش را امتحان کنید: echo day | sed s/day/night در مثال بالا خروجی night خواهد بود. در این مثال از quote استفاده نشدهاست، به دلیل آنکه نیاز نداشت. به شما توصیه میشود که از quote استفاده کنید. اگر در دستورات از meta-characters ها استفاده کنید به quote نیاز پیدا خواهید کرد. در صورتی که مطمئن نیستید حتما از quote استفاده کنید و بهتر است که به آن عادت کنید. در ادامه در تمامی مثال ها برای تاکید بر اهمیت استفاده از quote از آن استفاده خواهد شد. برای نمونه مثال قبلی : sed 's/day/night/' <old >new تأکید میشود که sed عینا مقداری را که شما به آن اشاره می کنید تغییر می دهد. دستور زیر را در نظر بگیرید: echo Sunday | sed 's/day/night/' مقدار خروجی Sunnight خواهد بود . چرا که تنها مقدار day که شما به آن اشاره داشتید جایگزین می شود. این دستور جانشینی دارای چهار بخش است: s دستور جانشین /../../ جدا کننده day عبارت منظم مورد نظر night جانشین عبارت منظم
اسلش به عنوان جداکنندهکاراکتری که بعد از s استفاده می شود یک جداکننده یا delimiter است. برای این منظور مرسوم است که از / استفاده شود به دلیل آنکه در ed، more و vi از آن استفاده می شود. در صورتی که شما بخواهید یک مسیر در فایل سیستم را جایگزین کنید، برای مثال /usr/local/bin/ را با common/bin/ باید کاراکترهای / را با \ escape کنید. sed 's/\/usr\/local\/bin/\/common\/bin/' <old >new
sed 's_/usr/local/bin_/common/bin_' <old >new
sed 's:/usr/local/bin:/common/bin:' <old >new
sed 's|/usr/local/bin|/common/bin|' <old >new شما می توانید هر کدام را که دوست دارید انتخاب کنید. هر کدام که کمتر در رشته شما استفاده شده. توجه داشته باشید که شما به سه جدا کننده نیاز دارید. در صورتی که با پیغام «Unterminated `s' command» مواجه شدید، بدانید که یکی از جداکننده ها را فراموش کرده اید.
استفاده از & به عنوان رشته مورد جستجوبرخی مواقع شما می خواهید یک رشته را جستجو کنید و به آن کاراکتری اضافه کنید، مانند پرانتر یا اضافه کردن یک کلمه به کلمه قبلی. این کار در صورتی که یک کلمه مشخص را جستجو می کنید بسیار ساده است: sed 's/abc/(abc)/' <old >new این روش زمانی که شما خروجی ثابتی برای الگوی (pattern) مورد نظر ندارید کار نخواهد کرد. برای این منظور از کاراکتر ویژه «&» استفاده می کنیم. این کاراکتر دقیقا برابر با خروجی مورد جستجو است: sed 's/[a-z]*/(&)/' <old >new شما هر چند بار که بخواهید می توانید از کاراکتر & استفاده کنید: echo "123 abc" | sed 's/[0-9]*/& &/' 123 123 abc بگذارید کمی بیشتر در مورد این مثال توضیح دادهشود. اولین تطابق برای*[0-9] اولین کاراکتر این خط است. به این معنی که هر عددی از صفر تا نه. بنابراین اگر ورودی «abc 123» باشد، خروجی تغییری نمی کند. راه درست اینکه تنها اعداد تکرار شود این است که الگو تنها اعداد را شامل شود: echo "123 abc" | sed 's/[0-9][0-9]*/& &/' 123 123 abc رشته abc بدون تغییر باقی خواهد ماند. زیرا که با الگوی مورد نظر منطبق نیست. در صورتی که می خواهید abc از رشته شما حذف شود باید الگوی خود را توسعه دهید به شکلی که با بخش های دیگر نیز منطبق شود و به طور مشخص بخش های مورد نظر خود را به کمک ( ) و \1 که در قسمت های بعدی توضیح داده خواهند شد تغییر دهید. استفاده از 1\ برای نگهداشتن بخشی از متن() و 1 از کاربردهای عبارتهای منظم هستند. شما با استفاده از آنها می توانید بخش هایی از الگو را مستثنی کنید. «1\» بخش اول الگو است و «2\» بخش دوم الگو است. sed تا ۹ بخش را می تواند نگه دارد. درصورتی که شما می خواهید کلمه اول یک خط را نگه دارید و بقیه را پاک کنید می توانید بخش مورد نظر را با پرانتز جدا کنید: sed 's/\([a-z]*\).*/\1/' برای نوشتن چنین دستوری باید بیشتر دقت کرد. الگو ها بزرگترین حالت ممکن را شامل می شوند. در اینجا *[a-z] از صفر تا هر تعداد حروف کوچک را شامل می شود. * از صفر تاهر تعدا کاراکتر را شامل می شود. اولین الگو تمام حروف کوچک و الگوی دوم هر آنچه بعد از الگوی اول باشد را شامل می شود. به همین دلیل در صورتی که شما دستور زیر را صادر کنید: echo abcd123 | sed 's/\([a-z]*\).*/\1/' خروجی abcd خواهد بود و تمامی اعداد حذف می شوند.
sed 's/\([a-z]*\) \([a-z]*\)/\2 \1/' به فاصله بین دو الگو بازیابی شده (\2 \1\) دقت کنید. این برای این است که مشخص باشد که دو کلمه یافت شده است. در حالتی که تنها یک الگو منطبق شده است، در خروجی تاثیری نخواهد داشت. در صورتی که تاکید دارید که حتما هر کلمه یک حرف را شامل شود: sed 's/\([a-z][a-z]*\) \([a-z][a-z]*\)/\2 \1/'
sed 's/\([a-z]*\) \1/\1/' شما می توانید تا «9\» را استفاده کنید.
پرچم های جاگذاری Substitution flagsشما می توانید پرچم های بیشتری را بعد از جداکننده آخر یا همان سوم استفاده کنید. شما می توانید از طریق آنها مشخص کنید که درصورتی که الگوی مورد نظر بیش از یک بار در یک خط یافت شد با آن چه رفتاری داشته باشد.
g/ جاگذاری سراسری (Global replacement)اغلب ابزارهای یونیکسی که بر روی فایل کار می کنند، یک خط را در یک مرتبه بررسی می کنند. sed نیز از همین روال پیروی می کند. به این معنی که تنها اولین تطابق در یک خط را در نظر می گیرد، در صورتی که شما می خواهید کل خط را بررسی کند و تمامی موارد یافت شده را اصلاح نماید. برای مثال در نظر بگیرید که می خواهید کلیه کلمات در یک خط را به طور جداگانه داخل یک پرانتز قرار دهید. در این مثال به جای استفاده از «*[A-Za-z]» که لغاتی مانند «won't» را شامل نمی شود از «*[^]» که با هر چیز به غیر از فاصله منطبق می شود استفاده می کنیم. در عین حال این الگو با هر چیزی منطبق می شود ، چرا که * به معنی صفر یا هر تعداد است. sed 's/[^ ]*/(&)/' <old >new
sed 's/[^ ][^ ]*/(&)/g' <old >new
آیا sed بازگشتی (Recurcive) است؟sed الگوها را تنها بر روی داده های ورودی اعمال می کند. این به این معنی است که یک خط را می خواند، زمانی که به مورد منطبق با الگو رسید خروجی را تولید می کند و سپس از ادامه خط شروع به جستجو می کند. به همین دلیل شما نباید نگران دستوراتی مانند زیر باشید: sed 's/loop/loop the loop/g' <old >new
1/,2/ و ... انتخاب مورد تطابقبدون مشخص کردن هیچ پرچمی اولین مورد تطابق با الگو تغییر خواهد کرد. با قرار داده پرچم g تمامی تطابق ها تغییر خواهند کرد. در صورتی که بخواهید تنها مورد دوم تغییر کند می توانید از »(\» و »)\» به همراه «1\» برای آنکه مورد اول تغییر نکند استفاده کنید. دراین مثال اولین مورد بدون تغییر باقی می ماند و مورد دوم پاک می شود: sed 's/\([a-zA-Z]*\) \([a-zA-Z]*\) /\1 /' <old >new
sed 's/[a-zA-Z]* //2' <old >new
sed 's/[a-zA-Z]* /DELETED /2g' <old >new دقت کنید «2/» را با «2\» اشتباه نگیرید. درباره وبلاگ:![]() آرشیو:طبقه بندی:آخرین پستها:پیوندها:پیوندهای روزانه:صفحات جانبی:نویسندگان:ابر برچسبها:آمار وبلاگ:The Theme Being Used Is MihanBlog Created By ThemeBox
|