Identifier replacesments
Leo de Wit
leo at philmds.UUCP
Mon Dec 19 04:13:26 AEST 1988
In article <620 at cimcor.mn.org> mike at cimcor.mn.org (Michael Grenier) writes:
|
|Does anyone know a simple shell script of program that will
|do identifier replacements in a file. I want to rename variables,
|etc. I could use /lib/cpp but it tends to remove comments and
|introduce other problems. Programs like sed will match
|an identifier but it is difficult to replace them without also replacing
|those longer words which might contain the identifier in question.
The following shell script will convert occurences of a variable name
with an other variable name, using sed. Output goes to stdout. You may
wish to deal with additional features: multiple variable names,
automatic replacement of the old file.
--------- c u t h e r e --------
#! /bin/sh
case $# in
0|1) echo "Usage: $0 <from_name> <to_name> [files ...]" 1>&2; exit 1;;
*) from=$1; to=$2; shift; shift;;
esac
case $from in
$to) echo "$0: <from_name> and <to_name> must differ" 1>&2; exit 1;;
esac
not="\([^A-Za-z_0-9]\)" # A 'not identifier character' pattern
exec sed "
s/^$from$/$to/
s/^$from$not/$to\1/
s/$not$from$/\1$to/
/$not$from$not/{
: again
s/$not$from$not/\1$to\2/g
t again
}" $*
--------- a n d h e r e --------
The sed statements handle 4 separate cases, depending on whether there
are any other characters on the same line: nothing before and after the
var, something after the var, something before the var, and something
before and after the var.
In the last case it is important to repeat the substitution while
substitution succeeds, since otherwise constructs like:
xxxxxxxxx var var xxxxxx
would not have 'var' correctly replaced (since the space inbetween the
'var's cannot be shared as delimiter).
Note the use of a shell variable to place a regular expression in; this
makes the sed stuff somewhat more readable.
Hope this helps -
Leo.
More information about the Comp.unix.questions
mailing list