AzLearn

تطبيق: تنظيف النص بـ sed

Text Cleanup with sed

تطبيق ~20 دقيقة

تطبيق: تنظيف النص بـ sed — Text Cleanup with sed

sed أداة تعديل نصوص stream editor. الاستخدام الأول الذي تحتاجه غالباً هو الاستبدال: sed 's/old/new/g'. هذا يعني استبدل كل ظهور لـold بـnew في كل سطر. في سكربتات Bash، نستخدمه لتنظيف مخرجات أو تحويل شكل بسيط، لا لتعديل ملفات حساسة مباشرة قبل فهم كامل.

احذر من sed -i لأنه يعدل الملف مكانه، وخياراته تختلف بين النظامين. هذا مصدر شائع لأخطاء قابلية النقل بين Linux وmacOS.

تعديل في المكان — الفروق بين Linux وmacOS

GNU sed (Linux): -i بدون امتداد يعدل مباشرة:

sed -i 's/foo/bar/' file.txt

BSD sed (macOS): -i تتطلب امتداد نسخة احتياطية، حتى لو كان فارغاً:

sed -i '' 's/foo/bar/' file.txt

إذا نسيت '' على macOS، يعاملها sed كاسم ملف ويفشل برسالة مربكة.

الحيلة المحمولة — نسخة احتياطية ثم حذف:

sed -i.bak 's/foo/bar/' file.txt && rm file.txt.bak

هذا يعمل على الاثنين: تنتج نسخة .bak على كل نظام، ثم تحذفها. أو استخدم فحص uname إذا أردت سلوكاً مختلفاً:

if [[ "$(uname)" == "Darwin" ]]; then
  sed -i '' 's/foo/bar/' file.txt
else
  sed -i 's/foo/bar/' file.txt
fi

في بداية التعلم، اطبع الناتج الجديد أولاً دون sed -i. عندما تحتاج تعديل ملف حقيقي، اعمل نسخة احتياطية أو اكتب إلى ملف جديد ثم راجع.

مثال تنظيف

script.sh

استخدمنا عدة -e لتجميع أكثر من استبدال. هذا واضح عندما تكون القائمة قصيرة. إذا كبرت التحويلات، ربما تحتاج ملف rules أو أداة مختلفة.

حدود sed

sed ممتاز للسطر الواحد والتحويلات الخطية. ليس مناسباً لفهم JSON أو HTML بشكل كامل. لا تستخدمه كـ parser لتنسيقات معقدة. Bash الجيد يعرف متى يتوقف.

تحدي — Challenge