sd - واجهة سطر أوامر بحث واستبدال بديهية
sd هي أداة بحث واستبدال سطر أوامر سريعة مكتوبة في Rust مصممة لجعل الحالة الشائعة بسيطة. حيث أن sed لديها بناء جملة مشفرة وهروب هش والاختلافات بين BSD/GNU sd تستخدم regex مباشرة (أو السلاسل الحرفية) وإشارات مجموعة التقاط واضحة ($1) وتقرأ/تكتب الملفات بأمان. لـ المهمة اليومية “استبدال X بـ Y عبر هذه الملفات” من الأسهل بكثير الحصول على حق من sed.
التثبيت
| المنصة | الأمر |
|---|
| Cargo (جميع المنصات) | cargo install sd |
| macOS (Homebrew) | brew install sd |
| Arch Linux | sudo pacman -S sd |
| Debian/Ubuntu | sudo apt install sd |
| Fedora | sudo dnf install sd |
| التحقق | sd --version |
الاستخدام الأساسي
sd تقرأ stdin أو الملفات. الشكل هو sd FIND REPLACE [FILES...].
| الأمر | الوصف |
|---|
| `echo “hello” | sd hello world` |
sd 'before' 'after' file.txt | استبدل في ملف (في المكان) |
sd 'before' 'after' *.txt | استبدل عبر ملفات عديدة |
sd --help | قائمة الخيارات الكاملة |
حرفي مقابل Regex
| الأمر | السلوك |
|---|
sd 'a.b' 'X' file | Regex: . يطابق أي شخصية |
sd -s 'a.b' 'X' file | سلسلة حرفية (-s/--string-mode) |
sd '\d+' 'N' file | Regex فئة الأرقام |
استخدم -s عندما يحتوي نص البحث الخاص بك على أحرف regex metacharacters تريد معاملتها حرفيًا — لا هروب يدوي.
مجموعات الالتقاط
sd تستخدم مراجع $1 و $2 البسيطة (أو ${1} عند التجاور بالنص).
# تبديل "First Last" → "Last, First"
echo "Ada Lovelace" | sd '(\w+) (\w+)' '$2, $1'
# → Lovelace, Ada
# أعد صيغة تواريخ YYYY-MM-DD → DD/MM/YYYY
sd '(\d{4})-(\d{2})-(\d{2})' '$3/$2/$1' dates.txt
# استخدم الأقواس عندما تكون المجموعة متبوعة بأرقام/أحرف
echo "v2" | sd 'v(\d)' 'version${1}0' # → version20
الخيارات الرئيسية
| الخيار | الوصف |
|---|
-s, --string-mode | التعامل مع FIND/REPLACE كسلاسل حرفية |
-p, --preview | عرض الفرق/النتيجة دون كتابة |
-f, --flags FLAGS | أعلام Regex: i (عدم تمييز الأحرف الكبيرة والصغيرة) و m و s وما إلى ذلك |
-n, --max-replacements N | حدد عدد الاستبدالات |
| stdin/stdout | حذف الملفات للعمل كمصفاة |
أعلام Regex (-f)
| الراية | التأثير |
|---|
i | عدم تمييز الأحرف الكبيرة والصغيرة |
m | متعدد الأسطر (^/$ تتطابق مع حدود الأسطر) |
s | النقطة تطابق الأسطر الجديدة |
w | مطابقة الكلمات الكاملة |
# استبدال عدم تمييز الأحرف الكبيرة والصغيرة
sd -f i 'error' 'ERROR' log.txt
معاينة آمنة
# اعرض ما سيتغيّر قبل ملامسة الملفات
sd -p 'foo' 'bar' src/*.rs
# ثم طبّق
sd 'foo' 'bar' src/*.rs
سير العمل الشائع
# أعد تسمية رمز عبر قاعدة أساس (معاينة أولاً)
sd -p 'oldFunctionName' 'newFunctionName' **/*.js
sd 'oldFunctionName' 'newFunctionName' **/*.js
# شطب المسافات البيضاء الزائدة
sd ' +$' '' file.txt
# استبدل مسار حرفي (وضع string يتجنب هروب النقاط/الشرطات المائلة)
sd -s './old/path.js' './new/path.js' config.json
# استخدام الأنبوب في سلسلة
cat access.log | sd '\d+\.\d+\.\d+\.\d+' '[REDACTED_IP]'
sd مقابل sed
| الجانب | sd | sed |
|---|
| البناء جملة | بسيط وحديث regex | موجز وتاريخي |
| مراجع Capture | $1 و $2 | \1 و \2 |
| الوضع الحرفي | -s (بدون هروب) | الهروب اليدوي |
| في المكان | الافتراضي للملفات | -i (BSD/GNU يختلفان) |
| تعديلات Streaming (sed-style) | ركزت على الاستبدال | محرر البث الكامل |
sd هو بحث واستبدال مركز؛ بالنسبة لتحرير البث بما يتجاوز الاستبدال sed/awk لا يزال ينطبق. للبحث (وليس الاستبدال) اقرن مع ripgrep.
الموارس