مثال هایی برای حذف خطوط و الگو ها از فایل ها

در این پست چگونگی حذف خطوط یا حذف خطوطی مبنی بر الگویی خاص توسط دستور sed در سیستم عامل های یونیکسی (لینوکس، بی اس دی، سولاریس و …) آموزش می دهم. sed ابزاریست در سیستم عامل های یونیکسی برای فیلتر کردن و یا تغییر دادن محتوای یک فایل. می توانید از آن بطو مثال برای حذف Space ها از یک خط، یا حذف کاراکتر های خاص از یک خط و غیره استفاده کنید. فرض کنید می خواهید Load Average را از دستور uptime در یک متغیر درون یک شل اسکریپت ذخیره کنید، می توانید از این دستور استفاده کنید. (این مطلب را بخوانید). پس می توان بجز فیلتر کردن یا تغییر دادن محتوای یک فایل، در مواردی مانند آنچه که گفته شد نیز استفاده کنید.برای شروع نخست مانند زیر یک فایل به نام testsed ایجاد کنید و خطوطی مانند زیر را به آن اضافه کنید :

cat > testsed

Linux
Solaris
FreeBSD
FeeNAS
AIX
Cygwin

Press Ctrl+D

برای درک دستور بالا این مطلب را بخوانید. با استفاده از فرمت زیر می توانید خطی را از فایل پاک کنید. بجای n شماره خط قرار می گیرد. مانند خط نخست از فایل، یا خط دهم یا هر خط دیگری از آن فایل که باید بجای FILENAME قرار بگیرد.d مخفف Delete است.

sed ‘ndFILENANE

  • بطور مثال دستور زیر نخستین خط فایل را پاک می کنید و نتیجه (بدون نخستین) خط را نشان می دهد.

sed ‘1d’ testsed

Solaris
FreeBSD
FeeNAS
AIX
Cygwin

  • دستور زیر سومین خط را پاک می کند.

sed ‘3d’ testsed

با اجرای فرمت بالا فایل اصلی (یعنی testsed) تغییری نخواهد کرد، بلکه تنها در خروجی نشان داده می شود. برای ثبت دائمی تغییرات، از سوئیچ i- استفاده کنید و نتیجه را در فایلی دیگر توسط Pipe کردن، ذخیره کنید و سپس در صورت تمایل می توانید فایل را ( که توسط Pipe ایجاد شده) تغییر نام به نام فایل اصلی (یعنی testsed) دهید. بهتر است فایل Pipe شده را در محلی دیگر ایجاد کنید که بتوانید آنرا تغییر نام دهید. فرمت کلی بصورت زیر است.

sed  -i ‘nd’ FIELNAME > /path/to/new_filename

برای حذف آخرین خط فایل از فرمت زیر استفاده کنید. دومین فرمت نیز تغییرات داده شده را بطور دائمی در یک فایل دیگر ذخیره می کند. از علامت $ بجای n برای حذف آخرین خط استفاده می کنیم. این در مقابل استفاده عدد 1 (در نخستین مثال ایم مطلب) بجای n برای پاک کردن نخستین خط می باشد.

sed ‘$d’ FILENAME

sed -i ‘$d’ FILENAME > /path/to/new_filename

برای حذف محدوده ای از خطوط، مانند پاک کردن خطوط 2 تا 4 از فرمت زیر استفاده کنید. یک علامت کاما (,) میان دو عدد n و m وجود دارد.

sed ‘n,md‘ FILENAME

sed ‘n,md‘ FILENAME > /path/to/new_filename

  • بطور مثال برای پاک کردن خطوط 2 تا 4 از دستور زیر استفاده کنید.

sed ‘1,4d’ testsed

برای پاک کردن نخستین تا آخرین خط نیز از فرمت زیر استفاده کنید. این یعنی کل محتوای یک فایل را پاک کنیم.

sed ‘1,$d’ FILENAME

sed  -i ‘1,$d’ FILENAME > /path/to/new_filename

برای پاک کردن تمامی خطوطی که با یک حرف ویژه شروع می شوند از فرمت زیر استفاده کنید. بطور مثال تمامی کاراکتر هایی که با L شروع می شوند. توجه کنید که میان L (بزرگ) با l (کوچیک) تفاوت وجود دارد. بجای CAHR باید یک کارکتر را جایگزین کنید.

sed ‘/^CHAR/d’ FILENAME

  • برای حذف تمامی خطوطی که با L شروع شوند.

sed ‘/^L/d’ testsed

 

برای پاک کردن تمامی خطوطی که با یک حرف ویژه به اتمام می رسند از فرمت زیر استفاده کنید. بطور مثال تمامی کاراکتر هایی که با L پایان می یابند. توجه کنید که میان X (بزرگ) با x (کوچیک) تفاوت وجود دارد. بجای CAHR باید یک کارکتر را جایگزین کنید.

sed ‘/CHAR$/d’ FILENAME

  • برای حذف تمامی خطوطی که با x خاتمه می یابند.

sed ‘/x$/d’ testsed

  • برای آنکه تمامی خطوطی که با یک حرف خاص شروع می شوند اما در حالتی که هم حرف بزرگ و هم کوچک را داشته باشیم از فرمت زیر استفاده کنید. بطور مثال دستور زیر تمامی خطوطی که با حروف l و L شروع می شوند را پاک می کند.

sed ‘/^[lL]/d’ testsed

  • برای آنکه تمامی خطوطی که با یک حرف خاص ختم می شوند اما در حالتی که هم حرف بزرگ و هم کوچک را داشته باشیم از فرمت زیر استفاده کنید. بطور مثال دستور زیر تمامی خطوطی که با حروف x و X ختم می شوند را پاک می کند.

sed ‘/[xX]$/d’ testsed

  • برای پاک کردن تمامی خطوط خالی از دستو (فرمت) زیر استفاده کنید.

sed ‘/^$/d’ FILENAME

  • برای پاک کردن خطوطی که تماما حروف بزرگ هستند از نخستین دستور و برای پاک کردن تمامی خطوطی که تماما حروف کوچک هستند از دومین دستور و برای پاک کردن تمامی خطوطی که تماما حروف هستند از سومین دستور زیر استفاده کنید.

sed ‘/^[A-Z]*$/d’ FILENAME

sed ‘/^[a-z]*$/d’ FILENAME

sed ‘/^[A-Z a-z]*$/d’ FILENAME

  • دستور زیر تمامی خطوط را پاک می کند، جز آنهایی که شامل کلمه ی Unix باشند. (هر کلمه دیگری را می توانید جایگزین کنید). علامت ! باعث می شوند همه چیز پاک شوند جز Unix ها.

sed ‘/Unix/!d’ testsed

  • علامت ! باعث می شوند همه چیز پاک شوند جز Unix ها. برای پاک کردن تنها تمامی خطوط شامل Unix ها از دستور زیر استفاده کنید. (بدون ! و توجه کنید که بزرگی و کوچی حروف مهم است)

sed ‘/Unix/d’ testsed

  • دستور زیر تمامی خطوطی که شامل کلمه های Unix یا Linux باشند را پاک می کنند. مفهوم یا را با استفاده از علامت | بکار برده ایم.

sed ‘/Unix\|Linux/d’ testsed

  • برای انکه تمامی خطوط حذف شوند جز آنهایی که شامل کلمه های Unix یا Linux هستند، همان دستور بالا را استفاده می کنیم ولی یک علامت ! نیز باید بکار ببریم.

sed ‘/Unix\|Linux/!d’ testsed

  • برای پاک کردن تمامی خطوط از نخستین خط تا رسیدن به نخستین خط که شامل کلمه ی Unix باشد از دستور زیر استفاده کنید. تمامی خطوط بعدی حتی اگر شامل Unix باشند نیز، حذف نخواهند شد.

sed ‘1,/Unix/d’ testsed testsed

  • دستور زیر تمامی خطوط بین نخستین خطی که شامل کلمه ی Unix باشید، تا به انتهای فایل (آخرین خط) پاک می کند. تمامی خطوط پیشین نگهداری می وند.

sed ‘/Unix/,$d‘ testsed

  • دستور زیر آخرین خط را پاک می کند، به شرط آنکه شامل یک کلمه یا الگوی خاصی باشد. بطور مثال در دستور زیر اگر آخرین خط شامل کلمه ی AIX باشد.

sed ‘${/AIX/d;}‘ testsed

  • دستور زیر مانند بالا تفسیر می شود ولی حذف خط آخر به شرط آن است که شامل کلمه ی AIX یا Linux باشد.

sed ‘${/AIX\|HPUX/d;}‘ testsed

  • دستور زیر خطی که شامل کلمه ی Unix باشد به همراه خطی بعدی آنرا پاک می کند. N یعنی Next

sed ‘/Unix/{N;d;}‘ testsed