Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2311
  • Last Modified:

scripting find grep replace in shell

Don't know if it matters, but using bash shell, I'm trying to do a find that will find all files with a patricular name that contains a particular text and do a vi substitute on that text.

Something like:

find . -name "MANIFEST.MF" -exec `vi - {} << EOD :%s/SOME_TEXT/NEW_TEXT/g :wq EOD` '{}' \;

The syntax probably isn't even remotely correct, but you get the gist of it. If you know of a better way, that's acceptible as well.
0
boucherc
Asked:
boucherc
  • 9
  • 4
  • 2
  • +3
1 Solution
 
fsetoCommented:
Instead of using vi, use sed...

find .  -name "MANIFEST.MF"  -exec sed  's/oldpatt/newpatt/g'  {} \;
0
 
omarfaridCommented:
Hi,

Vi  is an interactive editor. You may use other line editors like ed or ex.

e.g.

ed file <END
1,$ s/old/new/g
w
q
END


0
 
bouchercAuthor Commented:
fseto's response finds them all, and looks to replace them, but after execution when I do a find -exec grep "oldpatt", it still exists in the files it supposedly changed.
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
bouchercAuthor Commented:
omarfarid, it needs to be a single line command.
0
 
ozoCommented:
find .  -name "MANIFEST.MF"  -exec sed -i.bak 's/oldpatt/newpatt/g'  {} \;
0
 
bouchercAuthor Commented:
ozo, the above resulted in the following for each file that was attempted to be edited:

sed: illegal option -- i

Remember, this is Solaris 2.9, so some UNIX rules might not apply.
0
 
fsetoCommented:
Oops, forgot to pipe the output back to the orig file.  BTW, make sure you test this!  As if sed bombs, it will overwrite your existing data!  Instead of output to {}, you can use {}.new.  And then check for correctness.

find .  -name "MANIFEST.MF"  -exec sed  's/oldpatt/newpatt/g'  {} >! {} \;
0
 
bouchercAuthor Commented:
still didn't substitute them.
0
 
bouchercAuthor Commented:
it actually pipes it out to a file names !, which has the substituted text.
0
 
TalmashCommented:
do u have permissions to change the files?
0
 
omarfaridCommented:
Hi,

boucherc:

Why don't you take my script and develop it furhter :)

Here a modified one:

Call it myscript:

export count=$#
while test $count -gt 0
do
ed $1 <END
1,$ s/old/new/g
w
q
END
shift
done

make the script executable:

chmod +x /path/to/myscript

Then use it with find

find . -name "MANIFEST.MF" -exec /path/to/myscript {} \;
0
 
bouchercAuthor Commented:
omar

I tried your version as a script and got the following:

count=1: is not an identifier

and to talmash, yes, I do have the permissions to change the file.
0
 
omarfaridCommented:
Hi,

Which shell are you using? Can you till which line number gave the error?

Any way my script is incomplete. Please add the line below after END and before shift:

count=`expr $count - 1`

Also,

you may change export count=$# to

count=$#
export count
0
 
bouchercAuthor Commented:
I'm using bash, but wrote the script as bourne.
0
 
bouchercAuthor Commented:
after changing the export line to be 2 separate lines, I no longer get the "count=1: is not an identifier" error.

I named my script as change_manifest and here are its contents:

#!/bin/sh

count=$#
export count
while test $count -gt 0
do
ed $1 <END
1,$ s/jaleksyn/${LOGNAME}/g
w
q
END
shift
done

I didn't add the count=`expr $count - 1` line yet, but now I get the following when running
find . -name MANIFEST.MF -exec change_manifest {} \;

change_manifest: END: cannot open
change_manifest: 1,$: not found
 10:39am  up 25 day(s),  3:33,  2 users,  load average: 0.16, 0.17, 0.17
User     tty           login@  idle   JCPU   PCPU  what
root     console       2Nov0716days     23         -sh
dynamo   pts/1        10:20am                      w
change_manifest: q: not found
change_manifest: END: not found
change_manifest: END: cannot open
change_manifest: 1,$: not found
 10:39am  up 25 day(s),  3:33,  2 users,  load average: 0.16, 0.17, 0.17
User     tty           login@  idle   JCPU   PCPU  what
root     console       2Nov0716days     23         -sh
dynamo   pts/1        10:20am                      w
change_manifest: q: not found
change_manifest: END: not found
change_manifest: cannot shift


0
 
TintinCommented:
If you really want a one liner, the following will work on Solaris.

for f in `find . -name MANIFEST.MF`;do sed s/SOME_TEXT/NEW_TEXT/ $f >$f.new && mv $f.new $f;done
0
 
bouchercAuthor Commented:
BINGO! This was just what I was looking for.

Thank you.
0
 
omarfaridCommented:
Hi,

Sorry boucherc

It seams my copy and paste did copy properly. It should have been << END

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 9
  • 4
  • 2
  • +3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now