You can tell sed to carry out multiple operations by just repeating -e (or -f if your script is in a file). sed -i -e 's/a/b/g' -e 's/b/d/g' file makes both changes in the single file named file , in-place.
s/search/replace/g — this is the substitution command. The s stands for substitute (i.e. replace), the g instructs the command to replace all occurrences.
Remove all the files you don't want to edit by selecting them and pressing DEL, then right-click the remaining files and choose Open all. Now go to Search > Replace or press CTRL+H, which will launch the Replace menu. Here you'll find an option to Replace All in All Opened Documents.
There is no way to do it using only sed. You'll need to use at least the find utility together:
find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;
This command will create a .bak
file for each changed file.
Notes:
-i
argument for sed
command is a GNU extension, so, if you are running this command with the BSD's sed
you will need to redirect the output to a new file then rename it.find
utility does not implement the -exec
argument in old UNIX boxes, so, you will need to use a | xargs
instead.I prefer to use find | xargs cmd
over find -exec
because it's easier to remember.
This example globally replaces "foo" with "bar" in .txt files at or below your current directory:
find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g"
The -print0
and -0
options can be left out if your filenames do not contain funky characters such as spaces.
For portability, I don't rely on features of sed that are specific to linux or BSD. Instead I use the overwrite
script from Kernighan and Pike's book on the Unix Programming Environment.
The command is then
find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'
And the overwrite
script (which I use all over the place) is
#!/bin/sh
# overwrite: copy standard input to output after EOF
# (final version)
# set -x
case $# in
0|1) echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac
file=$1; shift
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15 # clean up files
if "$@" >$new # collect input
then
cp $file $old # save original file
trap 'trap "" 1 2 15; cp $old $file # ignore signals
rm -f $new $old; exit 1' 1 2 15 # during restore
cp $new $file
else
echo "overwrite: $1 failed, $file unchanged" 1>&2
exit 1
fi
rm -f $new $old
The idea is that it overwrites a file only if a command succeeds. Useful in find
and also where you would not want to use
sed 's/old/new/g' file > file # THIS CODE DOES NOT WORK
because the shell truncates the file before sed
can read it.
Might I suggest (after backing up your files):
find /the/folder -type f -exec sed -ibak 's/old/new/g' {} ';'
Example: replase {AutoStart} with 1 for all of the ini files under the /app/config/ folder and its child folders:
sed 's/{AutoStart}/1/g' /app/config/**/*.ini
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With