My script to replace strings in ASCII files

Kristian Vaaf vaaf at broadpark.no
Thu Jan 12 13:57:16 PST 2006


You have been very helpful!

I am glad people like you exist to educate those who cannot afford education.

All the best in the future,

Kristian Vaaf

----- Original Message -----
From: Giorgos Keramidas <keramida at ceid.upatras.gr>
Date: Thursday, January 12, 2006 2:01 pm
Subject: Re: My script to replace strings in ASCII files

> On 2006-01-11 21:40, lars <lars at gmx.at> wrote:
> >Kristian Vaaf wrote:
> >> Just curious, what do I need to do to be able to execute this
> >> script like:
> >>
> >> $ text-replace old_string new_string
> >>
> >> I find it a bit inconvenient having to edit the script for
> >> every thing I need to replace.
> 
> It is.  You should start using $1, $2, ... for options.
> 
> >> #!/usr/local/bin/bash
> >> #
> >> #   Replace old with new inside all text files.
> >> #   $URBAN: text-replace.sh,v 1.0 2005/10/24 15:09:05 vaaf Exp $
> >> #
> >>
> >> for file in `find . -type f ! -name ".*"`; do
> >>
> >> 	if [ "`file -b "$file" | grep text`" != "" ]; then
> >>
> >>         	sed -i '' "s/old/new/g" "$file"
> >>
> >>         	echo "$file: Done"
> >>
> >> 	fi
> >>
> >> done
> >
> > Why not open the file with vim and then
> > :.,$s/old/new/
> 
> Heh, that's nice, and it may even work with multiple files using
> vim's -c option in a way similar to sed(1):
> 
>    vim -c ':%s/old/new/' file
> 
> > Of course that's not scriptable...
> 
> Using the -c option shown above, it may be scriptable too :)
> 
> > Maybe you should interpolate the first and the second argument
> > into your regexes in the substitution with sed,
> > so you get "s/argument1/argument2/"
> >
> > Perl might help though.
> 
> This opens a whole can of worms though.  What if the user defined
> command-line parameters contain special characters (i.e. single
> quote, double quotes, etc.)?
> 
> Instead of having to go through all the hoops of parsing quotes
> and other special characters in a shell script, and then invoking
> sed on each file, passing one file at a time, I prefer using "in
> place editing":
> 
>    $ grep emacs .bashrc
>    export EDITOR='nemacs'
>    alias emacs='nemacs'
> 
>    $ perl -pi -e "s/'nemacs'/'emacs'/g" .bashrc
> 
>    $ grep emacs .bashrc
>    export EDITOR='emacs'
>    alias emacs='emacs'
> 
>    $ perl -pi -e "s/'emacs'/'nemacs'/g" .bashrc
> 
>    $ grep emacs .bashrc
>    export EDITOR='nemacs'
>    alias emacs='nemacs'
> 
>    $
> 
> The number of files passed as 'extra' arguments to perl in this
> case is only limited by the amount of text that can fit in a
> single command-line, and if that's not enough you can use
> xargs(1) to work around the limit:
> 
>    find . -type f -name \*foo\* | xargs perl -pi -e "s/old/new/g"
> 
> So, there's no need to write special shell scripts to do this :)
> 
> 



More information about the freebsd-questions mailing list