52 lines
1.2 KiB
Awk
52 lines
1.2 KiB
Awk
# translate.awk --- do tr-like stuff
|
|
#
|
|
# Arnold Robbins, arnold@skeeve.com, Public Domain
|
|
# August 1989
|
|
# February 2009 - bug fix
|
|
|
|
# Bugs: does not handle things like tr A-Z a-z; it has
|
|
# to be spelled out. However, if `to' is shorter than `from',
|
|
# the last character in `to' is used for the rest of `from'.
|
|
|
|
function stranslate(from, to, target, lf, lt, ltarget, t_ar, i, c,
|
|
result)
|
|
{
|
|
lf = length(from)
|
|
lt = length(to)
|
|
ltarget = length(target)
|
|
for (i = 1; i <= lt; i++)
|
|
t_ar[substr(from, i, 1)] = substr(to, i, 1)
|
|
if (lt < lf)
|
|
for (; i <= lf; i++)
|
|
t_ar[substr(from, i, 1)] = substr(to, lt, 1)
|
|
for (i = 1; i <= ltarget; i++) {
|
|
c = substr(target, i, 1)
|
|
if (c in t_ar)
|
|
c = t_ar[c]
|
|
result = result c
|
|
}
|
|
return result
|
|
}
|
|
|
|
function translate(from, to)
|
|
{
|
|
return $0 = stranslate(from, to, $0)
|
|
}
|
|
|
|
# main program
|
|
BEGIN {
|
|
if (ARGC < 3) {
|
|
print "usage: translate from to" > "/dev/stderr"
|
|
exit
|
|
}
|
|
FROM = ARGV[1]
|
|
TO = ARGV[2]
|
|
ARGC = 2
|
|
ARGV[1] = "-"
|
|
}
|
|
|
|
{
|
|
translate(FROM, TO)
|
|
print
|
|
}
|