43

I have a renamed js file which I have to call in each of my php pages. Now I want to replace that old name with the new one using shell. what iam using is this:

sed -i ’s/old/new/g’ * 

but this is giving the following error:

sed: -e expression #1, char 1: unknown command: 

How can I do this replacement?

8 Answers 8

57
sed -i.bak 's/old/new/g' *.php 

to do it recursively

find /path -type f -iname '*.php' -exec sed -i.bak 's/old/new/' "{}" +; 
Sign up to request clarification or add additional context in comments.

3 Comments

@WimPruiksma, I get the same error from BSD sed on the mac, but not from GNU sed (installed as gsed with brew).
sed -i is not POSIX standard required, so it's not in OS X or BSD iirc.
FTR: I've just replaced in place with sed and FreeBSD 11.3 using sed -i '' -e '...', as described in answers to stackoverflow.com/questions/12696125/sed-edit-file-in-place
33

There are probably less verbose solutions, but here we go:

for i in *; do sed -i 's/old/new/g' "$i"; done 

Mind you, it will only work on the current level of the file system, files in subdirectories will not be modified. Also, you might want to replace * with *.php, or make backups (pass an argument after -i, and it will make a backup with the given extension).

3 Comments

on OSX you have BSD sed, and need to pass a file extension for backups to the -i option. Check out this page
I get sed: couldn't edit includes: not a regular file for many folders.
I assume they are FIFOs or device files, or something other than a regular file. If you have non-regular files, you will have to use something else instead of a glob (like find -type f ...).
12

this one is very simple, without for or loop, and takes care of any number or nested directories

grep -rl 'oldText' [folderName-optional] | xargs sed -i 's/oldText/newText/g'

2 Comments

I get No such file or directory with this one and recursive directories.
@dman probably you have executed it with [folderName-optional] without changing it . you may remove it, or can keep only single dot without quotes grep -rl 'oldText' . | xargs sed -i 's/oldText/newText/g'
11

You are using Unicode apostrophes (RIGHT SINGLE QUOTATION MARK - U2019) instead of ASCII (0x27) apostrophes around your sed command argument.

Comments

9

I know I'm really late but still:

find . -type f -name "*.php"|xargs sed -i 's/old/new/g' 

1 Comment

Best answer here.
4
perl -pi -e 's/old/new/g' *.php 

1 Comment

got an error on OSX zsh: argument list too long: perl
3

For completeness, providing the OSX compatible version of the above accepted answer (to answer comment from @jamescampbell)

for i in *.php; do sed -i .orig 's/old/new/g' "$i"; done 

This command creates .orig backup files.

Comments

-3

Try this:

ls | grep "php" > files.txt for file in $(cat files.txt); do sed 's/catch/send/g' $file > TMPfile.php && mv TMPfile.php $file done 

1 Comment

Don't know about useless - but its a very ugly approach, then there's the fact that using fixed temporary file name (files.txt, TMPfile.php) will break if there's any concurrency.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.