إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

استبدال النصوص في العديد من الملفات دفعة واحدة

تقليص
X
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • [شرح] استبدال النصوص في العديد من الملفات دفعة واحدة

    السلام عليكم ورحمة الله وبركاته

    لينكس على السريع : استبدال النصوص في العديد من الملفات دفعة واحدة


    تذكير بالموضوع السابق :
    حفظ واستعادة صلاحيات الملفات


    يعتبر sed من بين الأدوات القوية على لينكس في عمل تعديلات على النصوص سواء حذف استبدال فلترة وغيرها، ومن خلال هذا الموضوع سنقوم بذكر بعض خصائصه وسنستعمله في استبدال كلمة معينة بكلمة أخرى في مجموعة من الملفات النصية دفعة واحدة لما له من فائدة سواء للمبرمجين أو لأي يكن .
    كما العادة سنقسم الموضوع لجزئين، جزء سنوضح فيه بعض الأوامر والخصائص التي سنحتاجها في الشرح، وبعدها ننتقل للشرح الأساسي الذي يتناول طريقة استبدال النصوص في العديد من الملفات دفعة واحدة.

    شرح بعض الأوامر والتقنيات

    المعامل ` `:

    يتم تعويض الأمر الذي بداخله بمخرجاته، مثال :

    كود:
     cp `locate updatedb` test
    في هذا الأمر مثلا سيتم تعويض locate updatedb بمخرجاته فيتم نسخها -وهي عبارة عن ملفات- عن طريق الأمر cp إلى المجلد test

    الأمر sed :

    كما ذكرنا سابقا فهو أمر خاص بفلترة النتائج سواء كانت ملفات أو مخرجات، مثلا نريد أن نقوم بالتعديل على مخرجات الأمر lsb_release -a

    ونريد استبدال Ubuntu ب Lubuntu سنقوم باستخدام الأمر التالي :
    كود:
                                                               lsb_release -a | sed 's/Ubuntu/Lubuntu/'




    إذن فكما تلاحظون فقد تمّ استخدام s/ والتي تعني استبدال، حسنا الآن مثلا نريد حذف السطر الذي توجد به كلمة wily ، سنستخدم الأمر التالي :
    كود:
                                                               lsb_release -a | sed '/wily/d'





    إذن قد تمّ البحث عن كلمة wily ثم تمّ تطبيق الخاصية d والتي تعني delete أي الحذف وبهذا تمّ حذف السطر الذي تتواجد به تلك الكلمة
    إذن الآن مذا لو أردنا استبدال أكثر من كلمة أو جملة وكذلك القيام بعمليات فلترة أخرى في نفس الوقت بدون إعادة كتابة الأمر كل مره بحيث نقوم بعمل ذلك في سطر واحد فقط، ومن أجل هذا يمكننا استخدام الطريقة التالية :
    كود:
                                                               lsb_release -a | sed -e 's/Ubuntu/Lubuntu/' -e 's/ID//' -e '/wily/d'

    أو بشكل أكثر بساطة :
    كود:
                                                               lsb_release -a | sed -e 's/Ubuntu/Lubuntu/;s/ID//;/wily/d'




    بهذا الأمر قمنا باستبدال Ubuntu ب Lubuntu، وID بلاشيء وقمنا بحذف السطر الذي توجد به كلمة wily
    يمكننا استخدام بعض التعابير النظامية مع الأمر sed لتحكم أكبر بالمخرجات، مثلا نريد حذف السطور التي تبتدأ بحرف D وذلك باستخدام العلامة ^ والتي تعني بداية السطر:



    ومثلا نريد حذف الأسطر الفارغة :


    تم استخدام العلامتين ^ التي تعني بداية السطر و$ التي تعني نهايته وبجمعهما معا يعني سطر فارغ .
    وعند استخدام تعابير نظامية غير تلك الأساسية، من الأفضل حينها استخدام الخيار -r حتى يتم التعرف عليها

    الآن مثال آخر أيضا :




    فكما تلاحظون بدون استخدام g مع خصائص sed تتم عملية الاستبدال مرة واحدة في كل سطر وباستخدام g يتم الاستبدال في كامل السطر.

    وكما نستطيع فلترة المخرجات يمكننا فعل ذلك على الملفات النصية أيضا، مثلا لدينا ملف نصي تحت اسم test.txt
    كود:
                                                               sed 's/yum/dnf/g' test.txt
    بهذا الأمر يتم استبدال yum ب dnf في كامل أسطر الملف -باستخدام الخاصية g – وتظهر محتويات الملف بعد تعديلها لكن لايتم تغيير محتوى الملف إلا عند استخدام الخيار -i :
    كود:
                                                               sed -i 's/yum/dnf/g' test.txt
    لمزيد من المعلومات حول هذا الأمر، يوجد له موضوع مفصّل، تجدونه على الرابط التالي :
    http://www.linuxac.org/forum/threads/64900

    شرح الطريقة

    الآن بعد أن شرحنا بعض خصائص الأمر ننتقل إلى موضوعنا الأساسي الخاص بفلترة محتويات مجموعة من الملفات دفعة واحدة
    الآن نفترض أننا نتواجد في مجلد ما يحتوي على مجموعة من الملفات النصية، ونود تغيير كلمة ما بكلمة أخرى في كل هذه الملفات، إذن من أجل هذا سنستخدم مثلا الأمر :
    كود:
                                                               sed -i 's/aptitude/apt-get/g' *

    إذن مذا لو كانت لدينا أيضا مجلدات فرعية داخل هذا المجلد ونريد فلترة ملفاتها هي الأخرى أيضا، الأمر الذي سنستخدمه لهذا هو الآتي :
    كود:
                                                               sed -i 's/aptitude/apt-get/g' `find -type f`

    إذن فكما تلاحظون فقد تمّ استخدام العلامتين ` ` ليتم تمرير مخرجات الأمر find ليستعملها sed
    استخدمنا الأمر find بالخيار -type f ليتم البحث عن الملفات فقط في المسار الحالي وهذا يشمل المجلدات الفرعية كذلك
    أو أكثر تحديدا مثلا فقط ملفات .py :
    كود:
                                                               sed -i 's/aptitude/apt-get/' `find -type f -name *.py`

    كان هذا كل ما في الموضوع، نرجو أن تكونوا قد استفدتم
    التعديل الأخير تم بواسطة OtmanGX; الساعة 24-04-2016, 04:51 PM.
يعمل...
X