Intuitive find & replace CLI (sed alternative)

Overview

sd - s[earch] & d[isplace]

sd is an intuitive find & replace CLI.

The Pitch

Why use it over any existing tools?

Painless regular expressions

sd uses regex syntax that you already know from JavaScript and Python. Forget about dealing with quirks of sed or awk - get productive immediately.

String-literal mode

Non-regex find & replace. No more backslashes or remembering which characters are special and need to be escaped.

Easy to read, easy to write

Find & replace expressions are split up, which makes them easy to read and write. No more messing with unclosed and escaped slashes.

Smart, common-sense defaults

Defaults follow common sense and are tailored for typical daily use.

Comparison to sed

While sed does a whole lot more, sd focuses on doing just one thing and doing it well.

Some cherry-picked examples, where sd shines:

  • Simpler syntax for replacing all occurrences:
    • sd: sd before after
    • sed: sed s/before/after/g
  • Replace newlines with commas:
    • sd: sd '\n' ','
    • sed: sed ':a;N;$!ba;s/\n/,/g'
  • Extracting stuff out of strings containing slashes:
    • sd: echo "sample with /path/" | sd '.*(/.*/)' '$1'
    • sed: use different delimiters every time depending on expression so that the command is not completely unreadable
      • echo "sample with /path/" | sed -E 's/.*(\\/.*\\/)/\1/g'
      • echo "sample with /path/" | sed -E 's|.*(/.*/)|\1|g'
  • In place modification of files:
    • sd: sd before after file.txt
    • sed: you need to remember to use -e or else some platforms will consider the next argument to be a backup suffix
      • sed -i -e 's/before/after/g' file.txt

Benchmarks

Simple replacement on ~1.5 gigabytes of JSON

hyperfine -w 3 'sed -E "s/\"/\'/g" *.json >/dev/null' 'sd "\"" "\'" *.json >/dev/null' --export-markdown out.md

Command Mean [s] Min…Max [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

Result: ~2.35 times faster

Regex replacement on a ~55M json file:

hyperfine \
'sed -E "s:(\w+):\1\1:g" dump.json >/dev/null'\
"sed 's:\(\w\+\):\1\1:g' dump.json >/dev/null"\
'sd "(\w+)" "$1$1" dump.json >/dev/null'
Command Mean [s] Min…Max [s]
sed -E "s:(\w+):\1\1:g" dump.json >/dev/null 11.315 ± 0.215 11.102…11.725
sed 's:\(\w\+\):\1\1: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

Result: ~11.93 times faster

Installation

Cargo

Cargo is the Rust package manager.

You can install cargo by

curl https://sh.rustup.rs -sSf | sh

Then

cargo install sd

Alpine Linux

apk add sd

Before installing, ensure the appropriate repository is enabled.

Arch Linux

pacman -S sd

Gentoo (unc3nsored overlay)

emerge -av sys-apps/sd

Before installing, ensure the appropriate overlay is enabled.

Fedora

dnf install sd

FreeBSD

pkg install sd

Windows

choco install sd-cli

macOS

brew install sd

Void Linux

xbps-install sd

Quick Guide

  1. String-literal mode. By default, expressions are treated as regex. Use -s or --string-mode to disable regex.
> echo 'lots((([]))) of special chars' | sd -s '((([])))' ''
lots of special chars
  1. Basic regex use - let's trim some trailing whitespace
> echo 'lorem ipsum 23   ' | sd '\s+$' ''
lorem ipsum 23
  1. Capture groups

Indexed capture groups:

> echo 'cargo +nightly watch' | sd '(\w+)\s+\+(\w+)\s+(\w+)' 'cmd: $1, channel: $2, subcmd: $3'
cmd: cargo, channel: nightly, subcmd: watch

Named capture groups:

> echo "123.45" | sd '(?P<dollars>\d+)\.(?P<cents>\d+)' '$dollars dollars and $cents cents'
123 dollars and 45 cents

In the unlikely case you stumble upon ambiguities, resolve them by using ${var} instead of $var. Here's an example:

> 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
  1. Find & replace in a file
> sd 'window.fetch' 'fetch' http.js

That's it. The file is modified in-place.

To preview changes:

> sd -p 'window.fetch' 'fetch' http.js 
  1. Find & replace across project

This example uses fd.

Good ol' unix philosophy to the rescue.

sd 'from "react"' 'from "preact"' $(fd --type file)

Same, but with backups (consider version control).

for file in $(fd --type file); do
  cp "$file" "$file.bk"
  sd 'from "react"' 'from "preact"' "$file"; 
done

Edge cases

replace/-with string needs extra -- before it, if starts with double-minus (this is a limitation of the bash itself)

echo "test/test" | sd '/' -- '--inteneded--'
test--inteneded--test

echo "start/--/end" | sd --string-mode -- '--' 'middle'
start/middle/end
Comments
  • Ignore directory arguments

    Ignore directory arguments

    I think it would be great if sd would silently ignore directory arguments. This would allow easier integration with shell globs and external tools like find/fd.

    Suppose I have the following structure:

    ▶ mkdir dir; echo "foo" > file; echo "foo foo" > dir/other_file
    ▶ tree
    .
    ├── dir
    │   └── other_file
    └── file
    

    Now I want to replace foo by bar, recursively. It'd be great if I could just call

    ▶ sd foo bar **/*
    

    However, this currently fails with:

    Error: Is a directory (os error 21)
    

    Interestingly, everything works with --in-place mode:

    ▶ sd -i foo bar **/*
    

    Admittedly, --in-place is almost always what I want if I supply any arguments, but I wonder if the normal (not in-place) mode should behave the same.

    Thinking of this, would it be an option to enable --in-place by default (if sd is not reading from STDIN)? Or would you consider this to be too dangerous?

    Awesome tool, by the way - Thank you!

    opened by sharkdp 7
  • Make it *very* obvious that sd will modify in-place

    Make it *very* obvious that sd will modify in-place

    First of all, thanks for the great tool! This is slowly becoming my default go-to instead of sed.

    I used sd today for the first time in a while, so I ran sd --help to refresh on the (admittedly intuitive) syntax.

    There was one line in the help dialog of note:

        -i, --in-place
                (Deprecated). Modify the files in-place. Otherwise, transformations will be emitted to STDOUT by default.
    

    If I'm not mistaken, this line is out of date. By default, sd does modify files in-place.

    I would personally vote for this tool to not modify in-place to more closely match the behavior of sed, awk, and other similar tools. I would argue that the most common use case for a tool like this is to run a few test cases through to ensure that you're doing what you think you're doing, iterate a few times, and then modify the file in place.

    However, I respect that you decided to move to the default of modifying in-place. I would ask, however, that we change the help text to make it very obvious that, by default, this tool modifies files in place. It can be very surprising to someone coming from sed, awk, or a ton of other tools. I was lucky that I had recently committed my file to git, otherwise I could have lost a lot of changes--my replacement did not behave the way I thought it would!

    I'm willing to submit a pull request if you'd be willing to merge such a change :)

    Thanks again for the great tool!

    opened by HarrisonMc555 5
  • Default [FILES] to all the files in current directory

    Default [FILES] to all the files in current directory

    I feel like modern CLI tools aiming for user's convenience (especially written in Rust, like rg, fd, sk (skim) etc) default to "all the files in current directory" (if it makes sense):

     sd [±:master] % rg replacement README.md
    49:**Simple replacement on ~1.5 gigabytes of JSON**
    61:**Regex replacement on a ~55M json file**:
    
    
    
     sd [±:master] % rg replacement
    README.md
    49:**Simple replacement on ~1.5 gigabytes of JSON**
    61:**Regex replacement on a ~55M json file**:
    
    src/cli.rs
    25:    /// Limit the number of replacements
    26:    pub replacements: Option<usize>,
    
    src/main.rs
    28:            options.replacements
    
    src/replacer.rs
    9:    replacements: usize,
    18:        replacements: Option<usize>,
    63:            replacements: replacements.unwrap_or(0),
    84:                self.replacements,
    90:                self.replacements,
    174:    fn sanity_check_literal_replacements() {
    179:    fn unescape_regex_replacements() {
    184:    fn no_unescape_literal_replacements() {
    
    build.rs
    26:                .help("Emit the replacement to STDOUT"),
    
    CHANGELOG.md
    16:- `sd` now uses memory-mapped files, allowing replacement on files of any size
    36:- Support for unicode and special characters (like `\n`) in replacement expressions
    

    I personally keep wishing for such behaviour for sd.

    opened by klas-genestack 4
  • sd throw errors when run on empty files

    sd throw errors when run on empty files

    Sometimes, user need to run sd on a large collection of file, eg. using fdor find. For evey file in this collection that's empty, sdwill throw the following error:

    Error processing foobar: memory map must have a non-zero length
    
    opened by Porkepix 4
  • sd creates corrupt files (

    sd creates corrupt files ("failed to write whole buffer")

    If the replacement string has a different length than the search pattern, sd either fails with an error "failed to write whole buffer" (when the replacement string is longer) or even leaves behind corrupt files (when the replacement string is shorter).

    How to reproduce:

    ▶ echo "foo" > dummy
    
    ▶ sd "foo" "fo" dummy
    
    ▶ hexdump -C dummy
    00000000  66 6f 0a 00                                       |fo..|
    00000004
    

    Notice the additional zero byte (00) at then end.

    opened by sharkdp 4
  • Dry-run mode

    Dry-run mode

    In ZMV there is the -n option flag that shows you what the output would be, without actually doing anything. It is very handy for fine-tuning the regexp before actually commiting the replacement to disk.

    However, whenever I want to use it I can't seem to remember that it's -n, so maybe it's not the best choice. The expanded --dry-run would make more sense.

    opened by franky47 4
  • Add Windows support by swapping out the `atomic_write` crate with the `atomicwrites` crate

    Add Windows support by swapping out the `atomic_write` crate with the `atomicwrites` crate

    Hey there! I don't know if you actually care about Windows support, but it was so straightforward that I figured I'd just submit a PR. Thanks for making this great tool! :)

    opened by ErichDonGubler 4
  • character escapes in code are being followed by sd

    character escapes in code are being followed by sd

    After running sd on a file

    sd "ProjectPaths" "Settings" -i $somefile
    

    This is an example diff:

    -                    "INTERNALERROR: invalid html: {:?}\nERROR:{:?}",
    +                    "INTERNALERROR: invalid html: {:?}
    +ERROR:{:?}",
    

    It looks like sd is interpreting the \n and using it when re-writing the file. I'm worried that other character escapes are also being treated in this way. I recommend doing extensive testing using a suite similar to the toml inputs

    https://github.com/alexcrichton/toml-rs/blob/master/test-suite/tests/valid/string-escapes.json

    I do roundtrip tests like this in stfu8, for example: https://github.com/vitiral/stfu8/blob/master/tests/sanity.rs#L84

    I also recommend running sd against unicode examples and asserting they don't change. You can see them in the .txt files here: https://github.com/vitiral/stfu8/tree/master/tests

    opened by vitiral 4
  • The input file flag is quite redundant/unintuitive

    The input file flag is quite redundant/unintuitive

    Cool project! This is sort of an opinionated issue, but bothers me enough when trying out sd that I figured I'd file it just so it's at least filed for the future.

    To put it quite bluntly, the -i flag is redundant in the interface you have. You could easily go from this:

    cat file.txt | sd -s '((([])))' ''
    

    To this:

    sd -s '((([])))' '' file.txt
    

    As it stands, you need -i file.txt, which I think is an unnecessary flag as it's quite common to see default positional arguments done this way (for example, cat works exactly as the above suggestion). In the few minutes of me trying this tool out, I forgot the -i at least 3 times.

    I think potentially removing the argument in favour of the positional makes for a little bit of a nicer experience. If you're committed to compatibility, you can probably keep -i around as an undocumented flag to avoid breaking existing workflows.

    Thoughts? I'm happy to try and file a PR for this when I get a few minutes, if that helps.

    opened by whitfin 4
  • [Question] Which regex syntax does sd use?

    [Question] Which regex syntax does sd use?

    Hello! I'm playing a little bit with sd and tried to execute the following:

    echo "some text 123" | sd -p 'some text (?<numbers>{3})' '${numbers}'
    

    I expected to get the output 123 but I'm getting

    Error: invalid regex regex parse error:
        some text (?<numbers>{3})
                    ^
    error: unrecognized flag
    

    instead. According to this cheatsheet I can use

    (?<name>...) | Named Capturing Group
    

    for a named group capturing but it doesn't work for sd. Where can I look up the regex syntax which sd uses?

    opened by TornaxO7 3
  • Installing on Windows with Chocolatey

    Installing on Windows with Chocolatey

    My CLI Swiss Army knife includes ripgrep, fd and fzf. And now sd. The first three can be installed on Windows with Chocolatey, which makes it easy to tell my friends and colleagues to check them out. It would be great to spread the word about sd too :)

    opened by mardukbp 3
  • A note on improving the example given in the README

    A note on improving the example given in the README

    Consider replacing the line: sd 'from "react"' 'from "preact"' $(fd --type file)

    with:

    fd --type file -x sd 'from "react"' 'from "preact"'

    Why: The latter is robust to file and directory names with spaces. The first is not. Thanks for your work!

    opened by thor314 0
  • Operations on capture groups

    Operations on capture groups

    I'd like to have some flexibility about how to use the captured text. My specific use case is about case: I'd like to lower case the matched text.

    Possible with sed: https://stackoverflow.com/a/1814396/8653979

    opened by AleCandido 3
  • Fails to remove html tag

    Fails to remove html tag

    The following fail:

    sd '</span>' '' file.txt
    sd -s '</span>' '' file.txt
    

    The respective sed command works:

     sed 's|</span>||g' file.txt
    

    Platform: Windows sd version: 0.7.6 Executed from within Git Bash.

    PS: I also tried various combinations with escaping the special characters, but nothing worked.

    opened by Vagelis-Prokopiou 0
  • Prompt before replacement

    Prompt before replacement

    Hi there! First off: Thanks for this tool! I find it much more useable than sed!

    As a feature-request: I was looking for a tool that provided a search and replace functionality over multiple files, that additionally prompts the user for input, whether or not the current match shall be replaced. Similar to how Vim does it:

    Peek 2022-08-11 08-23

    Could this be a possible feature for sd?

    opened by tim-hilt 1
Releases(v0.7.6)
  • v0.7.5(May 4, 2020)

  • v0.7.4(Apr 22, 2020)

    Changes:

    • c1f6242c7925893e036b9da4dd4529bb32162a92 (cargo-release) version 0.7.4
    • 88e2d3ed6dd909a9383cbaaf293e7b75c63adef8 replace: isolate memmap from file errs
    • 39c29b20cb6c6aae602622ba7eaa4fb23fb08b35 Ensure memmap source is not empty [ #74 ]
    • 4a5700595944c434511148c2c520ce46565da5fe Update cargo.toml + lock

    This list of changes was auto generated.

    Source code(tar.gz)
    Source code(zip)
    sd-0.7.4.x86_64-apple-darwin.zip(4.34 MB)
    sd-0.7.4.x86_64-pc-windows-msvc.zip(8.67 MB)
    sd-0.7.4.x86_64-unknown-linux-gnu.zip(20.30 MB)
  • v0.7.3(Apr 11, 2020)

  • v0.7.2(Mar 31, 2020)

  • 0.6.5(Jun 19, 2019)

  • 0.6.4(Jun 18, 2019)

    Changes:

    • 28da6b0bd74f032f8fe9b21e2ec4731473300f79 Azure pipelines - fix erroneous release condition
    • 7a4cc62379593f65f4c36c55dd7ddc66c1e71669 (cargo-release) version 0.6.4
    • bbee96e0c6930fb46baa780d5ab6b0f4adc417dc Prevent rustfmt from blocking builds
    • 0328591bb18395b79c45be25ff7d28886173a37c rustfmt
    • c2c6f87769d4ee6b360dd03c0cf26388bb3c1960 (cargo-release) version 0.6.3
    • 9aa17dda88c6e2fc69a20c88dcbd4a457fe4a49a Azure template - follow latest tagged release
    • f223fc8ce6455beac65cf51d3a779562b8dcb273 Drop mmap_source first
    • 4982a6645c9be2b5c243f0c0a87770736e757e79 Fix crash on Windows | resolves #37
    • 61d678c1d29eb44583590a7c58c3ac13c05c13c6 Merge pull request #28 from chmln/azure-pipelines
    • d8c806be82fffba76be279ecee29ebaf82920c2c Update readme
    See more
    • 29c80fd6d7641d8bde342216bcca0792c3fe3d04 Set up manpage generation
    • f698df2e4f9392905d709e1a371aa686443fb3b9 Remove redundant tests
    • 696847c426a41ed6504d4efbd2ae97845710ba2e Generate completions
    • d225a9024e372c016060816090d715b9ffc67072 rustfmt and cleanup
    • 6a31294da8f37e423eca186cb0e010f3bfa919cb fix github connection
    • 5bf4be22dbaa5b8cf0b106ebd09345064f2df7d2 move azure config to root
    • 25c7bc2a47f09c996bf82908f409166ff7673cf1 Merge branch 'master' of github.com:chmln/sd into azure-pipelines
    • 8f829f82134d16f8858be9c24c42639f9ef36d69 Update ci config
    • b85b084f3c8f14385018881aea7aeec4f64725ea Update CHANGELOG.md
    • 3037bae3634d48069a63d2af7aa6517281f97c5b (cargo-release) version 0.6.2
    • 678367c49503b71fcd56bcee620bd668a3c68bfe Merge pull request #40 from eclipseo/convert_str_as_bytes
    • 4e9aa7ddf297c2328f360e92e7e3b2978613e0a3 Convert str to bytes to call replacer.replace [ #39 ]
    • e98039ef066a9ea4d2a5ab85ef1a689b8fbd29eb (cargo-release) version 0.6.1
    • ab457f7c70384722a3d77c228fe291d98f7b59c1 Pre-allocate proper buffer size for memmap. [ #38 ]
    • f0ae7db4295ac1d7899c995322a5f70914c9a39f (cargo-release) version 0.6.0
    • 80d92bd237090014fa1aa7453772ab8bb7f31ea7 Remove smart-casing, implement full-word replace
    • 716005306030fff017bd0a089b315560d52cc83a Remove smart-case util check
    • 5a2094f733a785c3fe804b0f6e14c6ee4888ec5d Deprecate --in-place, add --preview
    • c22ce5ed5888e5ba2e43a8f884646f98828798b1 Cleanup & upgrade dependencies
    • bbd995f0222103581391faadf5900d40db69114c Merge branch 'master' of github.com:chmln/sd
    • dd3fe50bdb8580c083f5391e26a2c13343abe759 Upgrade dependencies
    • c4f05d5afe3dc761bcbb209db58e5c44e5369cbc Merge pull request #32 from svenstaro/patch-1
    • 123423a951f9c2bb88a2b458ae6d5aa6d17901f7 Update Arch Linux installation instructions
    • bc79c9b5edce2e1f5c658ee8d2a99b7f4723f8c0 update patch url
    • ae77cce863dd5aad10663868fd02dd9a6cff6762 test new template
    • abe7cbcfbd7262dd3a133eaa430de5cd52700300 has_matches() - use quicker method
    • a8f87ccc07ca3b9e582d29cf20a85d5e2faee9bc Merge branch 'mmap' of github.com:chmln/sd
    • c197fc231ecb2b976e61750f28746d2a8717db72 input.rs - cleanup
    • a83b3219602e609be319450773c0f502fd383677 Implement Error::log
    • c05140b3c2d935e21f073f435b34a5b915b990c3 rustfmt - tweak brace style
    • 060b7bb8a4a524ebd9716964b1c269eecf14bde0 mmap - rough version
    • e788f677cfa515af0e5fff7b640cf872560ca1df Merge pull request #29 from vthriller/master
    • a4cfa4997febe08b3f02ed8f301b216c2a7e0674 Briefly describe fd in the readme.
    • 1fe168ee436c821eba16dc46723ef4649604a9f7 Add condition for tagged commits
    • f78514a029f1a982344683f8f7baca8e469414c9 remove redundant condition
    • 10512ed3cd92c09cdf99a93f3ba0fbed5d5810d2 Remove redundant cargo check
    • c7cb1812bf5631546e83fb44a7cac733f1210409 remove circleci builds
    • aee2b5209cb92d2f079d8f284702e0e5e1c445d4 Remove duplicate condition
    • 36008c0434d0ed8e51d920e8ae4c3f28a1ee9e31 fix template path
    • 0fd9fc477e8b9404efb898c6c288054798084d0c azure pipelines - take 1
    • 193e5ed15800830560f2a841cd744ba4a668f41a Upgrade regex
    • 3609d743c3f9fa0edc7278869e49e9ca522d99f3 Preserve permissions; minor refactor [ #14 ]
    • 4846439875c01b86e17b9975af623f4e245f1d23 v0.5.0
    • 7c64a60f828a78502ecabf0ce40cdfa884338cd4 Merge pull request #19 from t6/patch-1
    • 7468cae3782b94728b3e344983627fe9278c15aa Add FreeBSD install instructions
    • d4f90cc50040214966ffe5be3b6a9fa0535a36c3 (cargo-release) version 0.5.0
    • e7188f8be2e79f2ff1dbb1eddd39ce047923725d Upgrade regex-syntax
    • a2d8b7a9e1d5bf2e374fda978cf4f07a0c1db86f Cleanup error handling
    • 6b3c95cba33b4921b603eb575abba23b2f54561a Merge pull request #17 from ErichDonGubler/windows
    • 77a1415593b78d34d99c719f64aafe785f10ecbc Add Windows support by swapping out the atomic_write crate with the atomicwrites crate
    • 5d5479348871a2d097aafab669b504d8f950dc03 (cargo-release) version 0.4.3
    • c4e5871668f5b31703b8a71ea2d4e4c8a7f21235 In-place replacement - dont halt on invalid input
    • b34c389712acd217ba20540caf3a520bdd8bafd5 Update changelog
    • 5ef0af0fecaad4d7653d1d58ed639cca23129460 (cargo-release) version 0.4.2
    • fb31a1b31be6faa62ba808f5b975e3f7c4663ba2 Add unescape tests + tweak literal mode behavior
    • 20228b6fe3e9688ac1b7ddea97ade4f618713174 Unescape replacement expression
    • 9a8e8a5c2f1ab01649a17e012b3fd85e91a7e8e2 Add some unit tests + tweak smart-case logic
    • e5f0cd4f7b334ff66c828f7a68d31991f977376c Use regex to replace literals
    • effa0fce14df42af90f27a6244a81a879aad81dc Disable unescaping
    • cddff2a977de3e6366ad07174e0a8d002e95b7bc disable unescaping + upgrade atomic-write
    • 01b6a71d8778fb1d7d13a404285d06387b4b615a Merge branch 'master' of github.com:chmln/sd
    • 9c5f93f9ce50fb2ae72de74fedf649c2316dd021 (cargo-release) version 0.4.1
    • 71b2211805d8ab333bf9accc7be5d21d7e8627b5 v0.4.1
    • 7ba1ac4f65307e1e8d9e3a24d24acb7dcf20cc24 Update README.md
    • 324fd1c132a5c63212e43497496bd106b9cb57b3 Add benchmarks
    • b9b66a394127f0cd647a5b73f1a91f25815d1615 Merge branch 'master' of github.com:chmln/sd
    • e1d95b81662ac800d0e6ab99e1550a313930f552 Update README
    • d2d36b9b0c4ab8a7f0ea9f8c3cecfa55ff0b8e66 Use copy-on-write strings + smart replace
    • 8d99e86a97083c4447ed50db5a95bfcffc560454 Rm claims until benchmarks
    • d4c6b20a6c1f14f65679005dccec04c628b7e5d6 .release.toml -> release.toml
    • 11e8da707c4fb1fbbe8df8814c5819eec107c67e Revert "(cargo-release) start next development iteration 0.4.1-alpha.0"
    • 97e44f0fc065a9bb264fbe465ff8b7752855ab9b (cargo-release) start next development iteration 0.4.1-alpha.0
    • f1032385a8396a18ce0f17a28a4e1edbb6c78666 (cargo-release) version 0.4.0
    • b76218c62ed6c6ed4175cf6ab61f16ea39382075 tweak description for --in-place
    • 5de065f9d2d093cb2910dd479d5a52e7ab593b86 Changelog: v0.4.0
    • 636cf2b6713cebb0f8fbadc990505606fab31286 Update README
    • 0b6764fe08881e52551e89486571455c396e51e1 Implement smart-case
    • fad88bd3673d98c164311cfe84f0aaad1019d124 Disable doc-comment transformations
    • 81cab2fc8c89f62b291c2377c8cdb5bfd273559d Merge branch 'master' of github.com:chmln/sd
    • ac8bbecd1ebef94e8d176bd4876b6c198899b74e Allow modification of multiple files
    • dd350e9cae917c7456a80587e6823da51fafd83b Create Result alias
    • e50783923abf5f9354cdd60e8f3d1405f6d61aa3 Add rayon
    • 4cc1fd9cf99889232aabd63229a5b371290947ef Add rustfmt config
    • 2d14ec33940cbaf29e63329dd838ba2b5a1bb271 Update README.md
    • 65b1aa57dac4bbb7117ed1adb3a31e5ff69ca271 Rewrite pipeline
    • 49302882e5d2ad7e9d9a5095f85c0386385e1ae5 (cargo-release) version 0.3.0
    • 684fe03691797f8e3ad78c98d833e8c288d7eb48 Add breakage note
    • 443ec368fd3ad19049238c0d5635bca019984e5e Add changelog
    • 5cea3efed588ca2ea35e9aed4b6120a53b8fe5c1 Revamp in-place flag [ #1 ]
    • 56a633dc4b0232a85ed50c4d5eb920cf8647adf7 Merge branch 'master' of github.com:chmln/sd
    • 00793888e58a2d225d2673c9aead0ed36c389aee Add atomic writes [ #3 ]
    • 3776cb9959534e876057b87b7b86159ba3e848ce Fix unescape warning [ #6 ]
    • 4a30f281deca57973f8d63644eecefe452f84fb0 Merge pull request #5 from wezm/patch-1
    • def52223034eaa481b9f66ca7783a047a6f4f137 Add details of AUR package to README
    • 4928e0a2db2dd3e23da1d7b7e800e3a0f19759db Merge pull request #2 from lambda/patch-1
    • da3f4c1580df5b7c138cc9edf771d2b17102e314 Update comparison with sed
    • 2f2215086893d8231bf3a88630ee538e151dc0ef Add install instructions
    • 33fd7b2bf648221793f1a0472f9d6dbd26b6ecfd Update README.md
    • a9073a0b76a996fa6d27425de2cd0c49453f61b0 Add release.toml
    • 1c86ff7782dbcacc839658b0fa700b5821671353 (cargo-release) version 0.2.0
    • 62c0056418dcecd6d6c32e05f011758cf4b920e6 Tweak flags and help output
    • 913a2151203cca3276b662983358ecede4d08391 Update README
    • 162cd3fd8631962afb7fea36f4660ac72e0f6404 Default to regex mode
    • 67afb2628aa31c74f417ebb3c1a642f651d4a36e Cleanup errors
    • b59be0d6faf3393d764a3f617284a28d0442e571 Let errors get printed automatically
    • 5bfc445bacabd813f348e819d300526de31f84d6 Tweak README
    • bb33cb1854f8b2ff6ef9d0ae5c0c6a31204584d9 Revamp README
    • 16edfd92909f2dca3fd7e0962f89a441d8c5ba28 Merge branch 'master' of github.com:chmln/sd
    • 2a2a28e23b034b1d70bea5b92ce0af051f637520 Discover structopt
    • e0f5a25454e0c2f011fc86f548ef4facb6c5fc98 Update README.md
    • a330281f2656079b4d78ec6965f88bc48c762b34 Update README.md
    • ffb97c1110d87991e562812be71ac2b7de1a1792 update cargo.lock
    • 4c69e5056ac242bd92be1c0ab6318cd75d6363cc Merge branch 'master' of github.com:chmln/sd
    • b2592bda14620722b12ba95495f1a49cab04064c fix up manifest
    • e6215c396486bd1be1048da50b82701fef57dc34 Update README.md
    • 996ab4b9fa0cfceab2e3dc84f104900f8797177a Update README.md
    • fd5b592253d12e7e58ab67d1ef7b523e831fb360 Add struggles
    • c50407df2267d39582507fc6ef97fa686864c1fc Create README.md
    • de21e874bd525a23778aa39f7812f8c9d4c4ffed Tweak help
    • 7bfe06213b54b9aa64b4f2c2b3eca8863b92ae94 Fix output containing escaped chars
    • 085d4ec12fb2f13dd3f6b4ed08010480f9e5d48c adjust ci caching
    • d8f2f1e20d7f1bb0428e68a1608a4492a29560a6 Add license + CI

    This list of changes was auto generated.

    Source code(tar.gz)
    Source code(zip)
    sd-0.6.4-x86_64-apple-darwin.zip(791.87 KB)
    sd-0.6.4-x86_64-pc-windows-gnu.zip(1.02 MB)
    sd-0.6.4-x86_64-pc-windows-msvc.zip(934.87 KB)
    sd-0.6.4-x86_64-unknown-linux-gnu.zip(971.05 KB)
Owner
Gregory
Gregory
Quick, lightweight find and replace cli tool.

quick-replace A fast, lightweight find and replace tool Usage quick-replace [OPTIONS] <FROM> <TO> <path/to/file.txt> Options Flag Description -h Displ

Liam Watts 3 Apr 7, 2023
fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find

fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find. While it does not aim to support all of find's powerful functionality, it provides sensible (opinionated) defaults for a majority of use cases.

David Peter 25.9k Jan 9, 2023
Semantic find-and-replace using tree-sitter-based macro expansion

Semantic find-and-replace using tree-sitter-based macro expansion

Isaac Clayton 15 Nov 10, 2022
A more compact and intuitive ASCII table in your terminal: an alternative to "man 7 ascii" and "ascii"

asciit A more compact and intuitive ASCII table in your terminal: an alternative to man 7 ascii and ascii. Colored numbers and letters are much more e

Qichen Liu 刘启辰 5 Nov 16, 2023
fas stand for Find all stuff and it's a go app that simplify the find command and allow you to easily search everything you nedd

fas fas stands for Find all stuff and it's a rust app that simplify the find command and allow you to easily search everything you need. Note: current

M4jrT0m 1 Dec 24, 2021
Most intuitive global cli maker. *(lazy_static + config-rs + clap)

argone Most intuitive global cli maker. *(lazy_static + config-rs + clap) | Examples | Docs | Latest Note | [dependencies] argone = "0.5" Phases Parsi

Doha Lee 6 Dec 9, 2022
Replace an app's icon from a png with a single terminal script. Made with Rust

Replace macOS App Icon Replace an app's icon from a png with a single terminal CLI. Made with Rust

Kunal Bagaria 8 Aug 3, 2022
A command-line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the returned URL.

Pup A command line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the return

SteveLau 11 Aug 17, 2022
A command line tool for people of transgender experience to replace their deadname within a Git repo.

chowndn (Change Owner from Dead Name) A command line tool for people of transgender experience to replace their dead name within a Git repo. See chown

Christi Miller 23 Dec 6, 2022
F-Fetch targets low systems. Written in Rust. It's very simple, designed so you can pick it up and replace it.

F-Fetch F-Fetch targets low systems. Written in Rust. It's very simple, designed so you can pick it up and replace it. First Look ~/.config/ffetch/con

cd 3 Jul 10, 2023
Automatically replace Discord CDN links with local file links, by downloading the images to the public folder

Auto Undiscord Did you hear that Discord will be blocking external websites from using images hosted on their servers? Did you host every image on you

Dot32 5 Nov 17, 2023
du + rust = dust. Like du but more intuitive.

Dust du + rust = dust. Like du but more intuitive. Why Because I want an easy way to see where my disk is being used. Demo Install Cargo cargo install

andy.boot 5.4k Jan 4, 2023
A more intuitive version of du in rust

A more intuitive version of du in rust

andy.boot 3k Sep 20, 2021
The intuitive command-line file uploader.

☁️ upl The intuitive command-line file uploader. ??️ Features (roadmap) Upload files via the command-line Sane built-in upload destinations Configurat

null 4 Oct 13, 2022
Intuitive GTK4/LibAdwaita music player

Resonance Harmonize your listening experience with Resonance. Resonance is an intuitive music player application written in Rust & Python, with a clea

Nathanael 25 Apr 7, 2023
Save cli commands and fuzzy find them later

crow - cli command memorizer What is crow? | Installation | Usage | FAQ What is crow? crow (command row) is a CLI tool to help you memorize CLI comman

sandstorm 7 Feb 17, 2022
A CLI tool to find the dominant colours in an image 🎨

dominant_colours This is a command-line tool for finding the dominant colours of an image. It prints their hex codes to the terminal, along with a pre

Alex Chan 65 Nov 10, 2022
CLI tool to find duplicate files based on their hashes.

Dupper Dupper is a CLI tool that helps you identify duplicate files based on their hashes (using the Seahash hashing algorithm). Installation You can

Rubén J.R. 4 Dec 27, 2022
A CLI tool connected to GPT-3 to help find the right terminal command

Command Recall A CLI tool connected to GPT-3 to help find the right terminal command Install to install the cli: cargo install --git https://github.co

Camille Moatti 102 Feb 18, 2023