سؤال

أنا أكتب نصًا برمجيًا لـ Shell (bash) وأحاول اكتشاف طريقة سهلة لإنجاز مهمة بسيطة.

لدي بعض السلسلة في متغير.لا أعرف ما إذا كان هذا مناسبًا، لكنه يمكن أن يحتوي على مسافات وأسطر جديدة، لأن هذه السلسلة في الواقع هي محتوى ملف نصي كامل.

أريد استبدال آخر تواجد لسلسلة فرعية معينة بشيء آخر.ربما يمكنني استخدام التعبير العادي لذلك، ولكن هناك نقطتان تربكانني:

  • أحتاج إلى المباراة من النهاية، وليس من البداية
  • السلسلة الفرعية التي أريد البحث عنها ثابتة وليست متغيرة.
هل كانت مفيدة؟

المحلول

  • للاقتطاع في البداية: ${var#pattern}
  • اقتطاع في النهاية ${var%pattern}
  • ${var/pattern/repl} للاستبدال العام

الأنماط عبارة عن توسيع نمط "اسم الملف"، ويمكن أن يكون الأخير مسبوقًا بـ # أو % للمطابقة فقط في البداية أو النهاية (على التوالي)

كل هذا موجود في صفحة bash (الطويلة).تحقق من فصل "توسيع المعلمة".

نصائح أخرى

آمين التعبير مثل هذا

s/match string here$/new string/

يجب أن تقوم بالخدعة - s للبديل، / لتقسيم الأمر، و$ هو نهاية علامة السطر.يمكنك تجربة ذلك في السادس لمعرفة ما إذا كان يفعل ما تحتاجه.

سأبحث في صفحات الرجل عن awk أو sed.

إجابة Javier خاصة بالصدفة ولن تعمل في جميع الأصداف.

الإجابات sed التي ألمح إليها MrTelly وepochwolf غير مكتملة ويجب أن تبدو كما يلي:

MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`

السبب وراء نجاح ذلك دون الحاجة إلى استخدام $ لوضع علامة على النهاية هو أن أول '.*' جشع وسيحاول جمع أكبر قدر ممكن مع السماح لبقية التعبير العادي بأن يكون صحيحًا.

يجب أن يعمل أمر sed هذا بشكل جيد في أي سياق Shell مستخدم.

عادة عندما أتعثر مع Sed أستخدم هذه الصفحة،

http://sed.sourceforge.net/sed1line.txt

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top