تطبيق: تنظيف النص بـ sed
Text Cleanup with sed
تطبيق: تنظيف النص بـ 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. عندما تحتاج تعديل ملف حقيقي، اعمل نسخة احتياطية أو اكتب إلى ملف جديد ثم راجع.
مثال تنظيف
استخدمنا عدة -e لتجميع أكثر من استبدال. هذا واضح عندما تكون القائمة قصيرة. إذا كبرت التحويلات، ربما تحتاج ملف rules أو أداة مختلفة.
حدود sed
sed ممتاز للسطر الواحد والتحويلات الخطية. ليس مناسباً لفهم JSON أو HTML بشكل كامل. لا تستخدمه كـ parser لتنسيقات معقدة. Bash الجيد يعرف متى يتوقف.