s
Earh & d
إزاحة sd
عبارة عن أداة بحث واستبدال بديهية لـ CLI.
لماذا استخدامه على أي الأدوات الموجودة؟
تعبيرات منتظمة غير مؤلمة. يستخدم sd
صيغة regex التي تعرفها بالفعل من JavaScript وPython. انسَ التعامل مع المراوغات الخاصة بـ sed
أو awk
- كن منتجًا على الفور.
وضع السلسلة الحرفية. بحث واستبدال غير عادي. لا مزيد من الخطوط المائلة العكسية أو تذكر الشخصيات المميزة التي يجب الهروب منها.
سهلة القراءة، وسهلة الكتابة. يتم تقسيم تعبيرات البحث والاستبدال، مما يسهل قراءتها وكتابتها. لا مزيد من العبث بالخطوط المائلة غير المغلقة والهاربة.
افتراضيات ذكية ومنطقية. تتبع الإعدادات الافتراضية المنطق السليم وهي مصممة للاستخدام اليومي النموذجي.
في حين أن sed يفعل أكثر من ذلك بكثير، يركز sd على القيام بشيء واحد فقط والقيام به بشكل جيد. فيما يلي بعض الأمثلة المنتقاة حيث تتألق sd.
بناء جملة أبسط لاستبدال كافة الأحداث:
sd before after
sed s/before/after/g
استبدال الأسطر الجديدة بفواصل:
sd 'n' ','
sed ':a;N;$!ba;s/n/,/g'
استخراج الأشياء من السلاسل التي تحتوي على خطوط مائلة:
sd: echo "sample with /path/" | sd '.*(/.*/)' '$1'
sed: echo "sample with /path/" | sed -E 's/.*(\/.*\/)/1/g'
باستخدام sed، يمكنك تحسين الأمر باستخدام محدد مختلف، لكنه لا يزال فوضويًا:
echo "sample with /path/" | sed -E 's|.*(/.*/)|1|g'
التعديل الموضعي للملفات:
sd: sd before after file.txt
sed: sed -i -e 's/before/after/g' file.txt
مع sed، عليك أن تتذكر استخدام -e
وإلا ستعتبر بعض الأنظمة الأساسية الوسيطة التالية بمثابة لاحقة احتياطية.
استبدال بسيط بحوالي 1.5 غيغابايت من JSON
hyperfine --warmup 3 --export-markdown out.md
' sed -E "s/"/ ' " ' " ' /g" *.json > /dev/null '
' sed "s/"/ ' " ' " ' /g" *.json > /dev/null '
' sd """ " ' " ' " ' " *.json > /dev/null '
يأمر | وسائل] | الحد الأدنى…الحد الأقصى [ق] |
---|---|---|
sed -E "s/"/'/g" *.json > /dev/null | 2.338 ± 0.008 | 2.332...2.358 |
sed "s/"/'/g" *.json > /dev/null | 2.365 ± 0.009 | 2.351...2.378 |
sd """ "'" *.json > /dev/null | 0.997 ± 0.006 | 0.987…1.007 |
النتيجة: ~2.35 مرة أسرع
استبدال Regex على ملف json يصل إلى 55M تقريبًا :
hyperfine --warmup 3 --export-markdown out.md
' sed -E "s:(w+):11:g" dump.json > /dev/null '
' sed "s:(w+):11:g" dump.json > /dev/null '
' sd "(w+)" "$1$1" dump.json > /dev/null '
يأمر | وسائل] | الحد الأدنى…الحد الأقصى [ق] |
---|---|---|
sed -E "s:(w+):11:g" dump.json > /dev/null | 11.315 ± 0.215 | 11.102…11.725 |
sed "s:(w+):11:g" dump.json > /dev/null | 11.239 ± 0.208 | 11.057…11.762 |
sd "(w+)" "$1$1" dump.json > /dev/null | 0.942 ± 0.004 | 0.936…0.951 |
النتيجة: ~11.93 مرة أسرع
التثبيت من خلال cargo
مع cargo install sd
، أو من خلال مديري الحزم المختلفين
وضع السلسلة الحرفية . بشكل افتراضي، يتم التعامل مع التعبيرات على أنها regex. استخدم -F
أو --fixed-strings
لتعطيل regex.
> echo ' lots((([]))) of special chars ' | sd -F ' ((([]))) ' ' '
lots of special chars
استخدام التعبير العادي الأساسي - دعنا نقطع بعض المسافات البيضاء الزائدة
> echo ' lorem ipsum 23 ' | sd ' s+$ ' ' '
lorem ipsum 23
التقاط المجموعات
مجموعات الالتقاط المفهرسة:
> echo ' cargo +nightly watch ' | sd ' (w+)s++(w+)s+(w+) ' ' cmd: $1, channel: $2, subcmd: $3 '
cmd: cargo, channel: nightly, subcmd: watch
مجموعات الالتقاط المسماة:
> echo " 123.45 " | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' $dollars dollars and $cents cents '
123 dollars and 45 cents
في الحالة غير المحتملة التي تتعثر فيها بعض الأمور الغامضة، قم بحلها باستخدام ${var}
بدلاً من $var
. هنا مثال:
> echo ' 123.45 ' | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' $dollars_dollars and $cents_cents '
and
> echo ' 123.45 ' | sd ' (?P<dollars>d+).(?P<cents>d+) ' ' ${dollars}_dollars and ${cents}_cents '
123_dollars and 45_cents
البحث والاستبدال في ملف
> sd ' window.fetch ' ' fetch ' http.js
هذا كل شيء. يتم تعديل الملف في المكان.
لمعاينة التغييرات:
> sd -p ' window.fetch ' ' fetch ' http.js
البحث والاستبدال عبر المشروع
يستخدم هذا المثال fd.
فلسفة يونكس جيدة للإنقاذ.
fd --type file --exec sd ' from "react" ' ' from "preact" '
نفس الشيء، ولكن مع النسخ الاحتياطية (ضع في اعتبارك التحكم في الإصدار).
fd --type file --exec cp {} {}.bk ; --exec sd ' from "react" ' ' from "preact" '
سوف يفسر sd كل وسيطة تبدأ بـ -
كعلامة (يحتمل أن تكون غير معروفة). يتم احترام الاتفاقية الشائعة لاستخدام --
للإشارة إلى نهاية الأعلام:
$ echo " ./hello foo " | sd " foo " " -w "
error: Found argument ' -w ' which wasn ' t expected, or isn ' t valid in this context
USAGE:
sd [OPTIONS] < find > < replace-with > [files]...
For more information try --help
$ echo " ./hello foo " | sd " foo " -- " -w "
./hello -w
$ echo " ./hello --foo " | sd -- " --foo " " -w "
./hello -w
للهروب من الحرف $
، استخدم $$
:
❯ echo " foo " | sd ' foo ' ' $$bar '
$bar