كيفية حذف أسطر معينة من ملف باستخدام sed

في مناسبات معينة نحتاج إلى حذف سطر معين من ملف أو عدة ملفات ، على سبيل المثال ، حدث لي أن لدي قائمة كاملة من الملفات وأحتاج إلى حذف السطر رقم 27 من كل هذه (السطر رقم 27 هو سطر ACL ، القاعدة ، القاعدة ، التكوين) ، إما يمكنني تحرير ملف بملف أو يمكنني فقط تحقيق ما أحتاجه باستخدام الأمر عطش ونص باش (اختياري).

لكن ، لنجرب ملفًا واحدًا بسيطًا إلى حد ما.

لدينا الملف توزيعات deb.txt الذي يحتوي على هذا:

ديبيان

كوبونتو

آرش لينكس

حل

نعناع

هذا هو الملف توزيعات deb.txt هو المكان الذي سنضع فيه التوزيعات القائمة على دبيان ، ولكن هناك نرى أنه في السطر رقم 3 هو "archlinux" ، وهو توزيعة من الواضح أنها لا علاقة لها بدبيان ، لذا يجب علينا حذف هذا السطر. لإزالة السطر رقم 3 من هذا الملف سنضع ما يلي:

sed "3d" distros-deb.txt > distros-deb-ok.txt

شرح هذا الخط سهل إلى حد ما ، مع العطش "ثلاثي الأبعاد" نشير إلى أننا سنحذف السطر رقم 3 مع توزيعات deb.txt نشير إلى الملف الذي يجب العمل عليه ، أي حذف السطر رقم 3 من هذا الملف ، حتى هنا إذا ضغطنا على Enter ، فسيظهر لنا ما نريد ولكن في المحطة ، لذلك باستخدام > توزيعات- deb-ok.txt نشير إلى أنه بدلاً من إظهار النتيجة في Terminal ، فإنها تضعها في ملف بهذا الاسم.

ما هو بسيط؟

أيضًا ، يمكننا تجنب استخدام ملف > توزيعات- deb-ok.txt باستخدام المعلمة المناسبة عطش، المعلمة -i

أي في حالة رغبتنا في إزالة السطر من الملف وحفظه بنفس الاسم (وليس في ملف آخر) ، ما عليك سوى إضافة المعلمة -i :

sed -i "3d" distros-deb.txt

سيؤدي هذا إلى إزالة السطر رقم 3 من distros-deb.txt وحفظه.

ماذا لو أردت نطاقًا من الخطوط ، أي إزالة السطر رقم 3 ولكن أيضًا رقم 4 ورقم 5؟ لتحقيق ذلك نضع النطاق من 3 إلى 5 ، أي:

sed -i "3,5d" distros-deb.txt

وسوف تظهر لي فقط ديبيان وكوبونتو 😀

إذن ماذا لو أردت حذف السطر 2 إلى السطر الأخير ، عندما لا أعرف مجموع السطور؟

فقط استخدم رمز الدولار - »$

sed -i "2,$d" distros-deb.txt

في حال كنت تريد الحذف من السطر الأول إلى رقم 4 ، فإننا ببساطة نضع القيمة 1 في البداية:

sed -i "1,4d" distros-deb.txt

لقد كان هذا كل شيء ، نصيحة مفيدة جدًا عندما تريد إنشاء نصوص bash لأتمتة المهام وتحتاج إلى تعديل وإزالة أسطر ملفات التكوين ، لتعديل يمكننا استخدامها عطش o بيرل، وكذلك للتخلص ، نعلم بالفعل كيفية القيام بذلك باستخدام sed 😉

تحياتي


محتوى المقال يلتزم بمبادئنا أخلاقيات التحرير. للإبلاغ عن خطأ انقر فوق هنا.

16 تعليقات ، اترك لك

اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   تطوير MSS قال

    مساهمة جيدة جدا 😉

    1.    KZKG ^ جارا قال

      شكرا لك

      بالمناسبة استلمنا ايميلك حالا سأجيب عليك 😀

      تحياتي

  2.   مجهول قال

    بصفتي رئيسًا للمحطة الطرفية والخوادم واتصالات ssh ، أتيت إليك ، يا KZKG ^ Gaara الرائع ، وأسألك: أين يمكنني الحصول على برنامج تعليمي على مستوى جهلي يسمح لي باستخدام اتصالات ssh بين جهازين عن بُعد في شبكات مختلفة للمشاركة ملفات نصية ، pdf ، صورة وصوت (mp3)….

    ؟؟؟؟

    على محمل الجد ، هل يمكنك إرشادي في هذا الصدد ، لدي جهازان ، أحدهما في العمل والآخر في المنزل وأحتاج إلى اتصال ssh بينهما (لأنني أفهم ذلك ، فإن ssh يسمح بمشاركة المحتوى بين الأجهزة ، هل أنا مخطئ؟).
    وإذا كنت مخطئا ، ما هو التطبيق الذي تنصحني به؟
    وأين أجد تعليميًا أساسيًا في هذا الصدد؟

    1.    -جاسوس- قال

      scp.

      scp user @ machine_address: path user @ machine_address: path.

      نفس صيغة cp ، المصدر -> الوجهة.

  3.   F3niX قال

    لقد ظهرت يا رجل ، لقد ضاعت.

  4.   خواكين قال

    نصيحة جيدة!

  5.   ليكوس هاكر قال

    نصيحة مثيرة للاهتمام ... xD

    بالصدفة أنك لا تعرف واحدًا يجعل النص الغامق بارزًا؟
    أعني ، لدي ملف txt وهو عبارة عن قاموس ، يحتوي على أكثر من 10000 سطر وأريده أن يبرز نصًا معينًا قبل ":" نقاط التعليق والقيام بذلك واحدًا تلو الآخر كثيرًا جدًا.

    1.    KZKG ^ جارا قال

      مرحبا،

      ملف txt هو نص عادي ، كما يوحي الاسم ... عادي ، بدون تنسيقات أو أي شيء مشابه ، أنا آسف ولكن لا أعتقد أن ما تطلبه يمكن القيام به ، أليس كذلك؟ 🙁

      تحياتي

      1.    هيئة مكافحة الفساد قال

        في الواقع يمكن ذلك ، ولكن عليك معرفة تنسيق الوجهة.
        بي:
        صدى $ (صدى "روبرت: مرحبًا. غيّر هنا" | sed 's / \ ./. \\ e [40؛ 31m /؛ s /: /: \\ e [40؛ 35m /')
        إنها مسألة تدبير.
        الطريقة الأخرى للحذف التي يمكن استخدامها هي sed '/' $ 1 '/ d' لكن عليك التأكد من re.

        1.    ليكوس هاكر قال

          ثم إنهاء حفظه في * .odt

          أليست هناك طريقة أسهل للقيام بذلك مع LibreOffice؟

  6.   لولو قال

    هل يمكنك حذف جزء من السطر وترك الباقي؟

    لنفترض أنني أريد حذف كل شيء أمام كلمة في صف معين.

    أو احذف كل ما يلي هذه الكلمة.

    1.    هيئة مكافحة الفساد قال

      نعم ، إنها مسألة سحب regex (إذا لزم الأمر man sed -r، –regexp-extension)
      بدءا من ما أجده
      صدى «روبرت: أهلا. التغيير هنا »| sed 's / Change //'
      بنمط محدد جيدًا ومع. (حرف واحد) و * (أكثر من حرف)
      ثم:
      صدى «روبرت: أهلا. التغيير هنا »| sed 's / Change. * //'
      قبل:
      صدى «روبرت: أهلا. التغيير هنا »| sed 's /. * تغيير //'
      إذا كان من المهم أن تظهر الكلمة
      صدى «روبرت: أهلا. التغيير هنا »| sed 's / Change. * / Change /'
      أو أكثر تفصيلاً
      في السطر الذي يحتوي على روبرت ما بعد التغيير
      صدى «فريتز: مرحبًا. التغيير هنا \ n روبرت: مرحبًا. التغيير هنا »| sed '/Robert/s/Cambio.*//'
      أو ما شابه في البداية ، قم بإخراج السطر الثاني ومعالجة الباقي
      صدى «فريتز: مرحبًا. التغيير هنا \ n روبرت: مرحبًا. التغيير هنا \ n أخرى »| sed -e 2d -e 's / Change. * //'
      صدى «فريتز: مرحبًا. التغيير هنا \ n روبرت: مرحبًا. التغيير هنا \ n أخرى »| sed '2d؛ s / Change. * //'

      1.    لولو قال

        شكرا ، انه مفيد جدا لي

  7.   MSX قال

    مقال جميل ، يعجبني ، ما أعظم مسؤول النظام!
    ماذا ستكون حياتنا بدون sed ، awek ، perl ، grep ، tail ، head ، "Emacs" والعديد من الأدوات الأساسية الأخرى!؟

  8.   ليزبيث أولارفيس قال

    شكرا ، لقد كان مفيدا جدا.

  9.   بيرني قال

    مرحبًا ، وكيف يمكنك حذف الأسطر 1,4،10 و XNUMX في نفس الأمر من ملف؟