s
및 d
isplace sd
직관적인 찾기 및 바꾸기 CLI입니다.
기존 도구보다 더 많이 사용하는 이유는 무엇입니까?
고통없는 정규 표현식. sd
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.5GB의 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배 더 빨라짐
~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 '
명령 | 수단] | 최소…최대 [초] |
---|---|---|
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 install sd
사용하여 cargo
통해 설치하거나 다양한 패키지 관리자를 통해 설치
문자열 리터럴 모드 . 기본적으로 표현식은 정규식으로 처리됩니다. 정규식을 비활성화하려면 -F
또는 --fixed-strings
사용하십시오.
> 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