How to Replace String in file from Command Line for Windows/Mac/Linux
Very Fast cross-platform tool to Find and Replace text in file for Windows/Linux/Mac - freeware sd
Free Download (Windows, Mac and Linux)
After downloading, unzip it and put the binary file sd (sd.exe on Windows) in a folder which in the PATH environment variable
I wrote this article on Windows, and by setting up a Linux environment on Windows, then I can use many command line tools from Linux on Windows
I used command line tools find
and sed
to find the files and modify the strings in files, but now I don't need them any more
Before continuing, you can download this example replace.txt, place it in the current directory, and open it in a text editor. The editor should have the ability to automatically reload the changed file, and you can press Ctrl + Z
to restore the text after replacement
Replace.txt:
Easiest is easiest
<li class="cba"><a href="z.html">~-remove - me-~</a></li> <li class="cba"><a href="y.html">keep me</a></li>
<!--comments-->
remove me
please
<!--comments-->
CLI text replace tool basic usage
sd 0.6.5
USAGE:
sd.exe [OPTIONS] <find> <replace_with> [files]...
OPTIONS:
-f, --flags <flags>
Regex flags. May be combined (like `-f mc`).
c - case-sensitive
i - case-insensitive
m - multi-line matching
w - match full words only
-h, --help
Prints help information
-i, --in-place
(Deprecated). Modify the files in-place. Otherwise, transformations will be emitted to STDOUT by default
-s, --string-mode
Treat expressions as non-regex strings
-p, --preview
-V, --version
Prints version information
ARGS:
<find>
The regexp or string (if -s) to search for
<replace_with>
What to replace each match with. Unless in string mode, you may use captured values like $1, $2, etc
<files>...
The path to file(s). This is optional - sd can also read from STDIN
How to find replace text with raw string literal (No Regex)
Find the text Easiest
in the file replace.txt
, and replace all instances with Easy
, case sensitive
$ sd --string-mode Easiest Easy replace.txt
How to replace string ignore case (case insensitive)
Replace Easiest
with easy
, case insensitive
$ sd --string-mode --flags i Easiest easy replace.txt
How to search and replace string using Regular Expression
Read the Regex Syntax Guide first
Here is a Regex example that removes some text from the second line from replace.txt
$ sd '(?:<[^>]+>){2}~-[\w\s-]+-~(?:<[^>]+>){2}' '' replace.txt
How to search and replace multiple lines string
Here is a Regular Expression example that replaces multiple comments with empty string:
$ sd '(?s)<!--comments-->.+?<!--comments-->' '' replace.txt
To understand this example, you need to understand Regular Expression flags:
Flags are each a single character. For example, (?x) sets the flag x and (?-x) clears the flag x. > Multiple flags can be set or cleared at the same time: (?xy) sets both the x and y flags and (?x-y)> sets the x flag and clears the y flag All flags are by default disabled unless stated otherwise. They are:
i
case-insensitive: letters match both upper and lower casem
multi-line mode: ^ and $ match begin/end of lines
allow . to match \n
Here we use the flag (?s)
to allowing . to match new line(\n)
.
can match any character except new line (includes new line with s flag)
How to modify string in multiple files recursively
Please read the article How to Find File with Name, Extension, Size and Date in directory on Windows/Mac first
We use sd with fd to replace strings in many files
Find all html files, and replace raw string www.easiestsoft.com
to easiestsoft.com
, case insensitive:
$ sd --string-mode --flags i `www.easiestsoft.com` `easiestsoft.com` ($fd --ignore-case --type file --extension html)
How to replace text in thousands files quickly
When using the above command to replace string in thousands of files, you may encounter argument list too long
or too many files
errors
This is the command line string length limit enforced by operation system, we can use xargs
in combination to avoid this limitation
But Windows system does not have xargs
, what should we do?
You can first follow the guide to set up a minimal Linux system on Windows
Here is the command to replace text in thousands of files:
$ fd -0 --ignore-case --type file --extension html | xargs -0 sd --string-mode --flags i `www.easiestsoft.com` `easiestsoft.com`
If there is a risk of filenames containing spaces or other special characters, you should remember to use the -0
flag
Useful Links:
- https://easiestsoft.com/win/software-to-run-linux-commands-on-windows/
- https://easiestsoft.com/web/command-line-find-file-with-name-extension-size-in-directory/
- https://github.com/chmln/sd
- https://docs.rs/regex
- https://github.com/sharkdp/fd
- https://github.com/BurntSushi/ripgrep
- https://github.com/jhspetersson/fselect
2019-12-20 King Eca