s
ค้นหา & d
isplace sd
เป็นการค้นหาและแทนที่ CLI ที่ใช้งานง่าย
เหตุใดจึงต้องใช้มันทับเครื่องมือที่มีอยู่?
การแสดงออกปกติที่ไม่เจ็บปวด sd
ใช้ไวยากรณ์ regex ที่คุณรู้อยู่แล้วจาก JavaScript และ Python ลืมการรับมือกับนิสัยแปลกๆ ของ sed
หรือ awk
ไปได้เลย ทำงานอย่างมีประสิทธิภาพทันที
โหมดสตริงตัวอักษร ค้นหาและแทนที่ที่ไม่ใช่ Regex ไม่ต้องแบ็กสแลชหรือจดจำอักขระตัวใดเป็นพิเศษและจำเป็นต้องหลีกอีกต่อไป
อ่านง่ายเขียนง่าย นิพจน์การค้นหาและแทนที่จะถูกแยกออก ซึ่งทำให้อ่านและเขียนได้ง่าย ไม่ต้องวุ่นวายกับการสแลชแบบปิดและแบบ Escape อีกต่อไป
ค่าเริ่มต้นที่ชาญฉลาดและสามัญสำนึก ค่าเริ่มต้นเป็นไปตามสามัญสำนึกและได้รับการปรับแต่งสำหรับการใช้งานประจำวันโดยทั่วไป
แม้ว่า 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
ไม่เช่นนั้นบางแพลตฟอร์มจะถือว่าอาร์กิวเมนต์ถัดไปเป็นส่วนต่อท้ายสำรอง
แทนที่ JSON ~1.5 กิกะไบต์อย่างง่ายดาย
hyperfine --warmup 3 --export-markdown out.md
' sed -E "s/"/ ' " ' " ' /g" *.json > /dev/null '
' sed "s/"/ ' " ' " ' /g" *.json > /dev/null '
' sd """ " ' " ' " ' " *.json > /dev/null '
สั่งการ | วิธี] | ต่ำสุด…สูงสุด [s] |
---|---|---|
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 ในไฟล์ ~ 55M json :
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 '
สั่งการ | วิธี] | ต่ำสุด…สูงสุด [s] |
---|---|---|
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
การใช้ regex ขั้นพื้นฐาน - มาตัดแต่งช่องว่างต่อท้ายกัน
> 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