I run this command to find and replace all occurrences of 'apple' with 'orange' in all files in root of my site:
find ./ -exec sed -i 's/apple/orange/g' {} \;
But it doesn't go through sub directories.
What is wrong with this command?
Here are some lines of output of find ./
:
./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php
find ./
and post some sample output? And the directory strucuture please. edit: thanks!
Your find
should look like that to avoid sending directory names to sed
:
find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;
For larger s&r tasks it's better and faster to use grep and xargs, so, for example;
grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'
git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
xargs sed -i '' 's/apples/oranges/g'
sed
with |
rather than /
, e.g. ... xargs sed -i 's|mduuid/apples|mduuid/oranges|g'
stackoverflow.com/questions/40714970/…
Since there are also macOS folks reading this one (as I did), the following code worked for me (on 10.14)
egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @
All other answers using -i
and -e
do not work on macOS.
This worked for me:
find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;
*.php
is really incorrect; you just got lucky that it didn't get expanded in the starting directory because you didn't happen to have any matching files there.
-name *.php
on the find
command.
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"
I think we can do this with one line simple command
for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done
Refer to this page.
Found a great program for this called ruplacer
https://github.com/dmerejkowsky/ruplacer
Usage
ruplacer before_text after_text # prints out list of things it will replace
ruplacer before_text after_text --go # executes the replacements
It also respects .gitignore
so it won't mess up your .git
or node_modules
directories (find .
by default will go into your .git directory and can corrupt it!!!)
In linuxOS:
sed -i 's/textSerch/textReplace/g' namefile
if "sed" not work try :
perl -i -pe 's/textSerch/textReplace/g' namefile
Success story sharing
sed -i 's/apple/orange/g'
tosed -i '' 's/apple/orange/g'
to make this work.-i
takes an argument: the extension used to save the temporary file. In GNU sed, looks like there's no space between-i
and its argument, but in BSD sed there is… so BSD-i '' 's/foo/bar/'
is equivalent to GNU-i 's/foo/bar/
.-e
does not work on Mac OS.touch a b c d e
followed by the command above produces a directory listing like this:a a-e b b-e c c-e d d-e e e-e
.RE error: illegal byte sequence
'{}'
, because fish automatically expands the empty braces if not quoted.