- 程序有所改变。发帖如还有问题请报告
- 【征集】西西河的经济学,及清流措施,需要主动参与者,『稷下学宫』新认证方式,24年网站打算和努力目标
主题:【讨论】ksh编程的一个问题 -- HAL
假设一个变量path记录了一个路径信息,比如
path=d:/cygwin/home/tester/hi_Monster_you/data
如何将路径中的Monster替换成Girl?
当然这个Monster可以出现在任意位置,可能重复.
限制条件:使用环境是嵌入式linux,不能用sed, perl, tr, cut等工具.大小写不敏感。(有awk但不想用)
比如说,设定一个字符串 str1=testMonwork
然后你再 echo ${str1/Mon/Girl} 看看?
具体的花样可以参考一下这个:Manipulating String
#! /bin/bash
A="123412345123456"
B="234"
C="bcd"
echo $A
for ((i=0; i<${#A}; i=i+1)); do
if [ "${A:i:${#B}}" == "$B" ]; then
echo -n "$C"
((i=i+${#B}-1))
else
echo -n "${A:i:1}"
fi
done
echo
都bash了,还是装个busybox吧,live会easy很多的,呵呵
问题的核心是要用最简单的方法去实现,最好是ksh自带的
ksh可以用这个match and cut,但是不能忽略大小写
${var%%}
${var##}
好像可以转换字符串,加上判断的话应该没有问题, ksh 不怎么用,只知道这些了。
H:\>ksh
$ path=d:/cygwin/home/tester/hi_Monster_you/data
$ echo ${path%Monster*}Girl${path##*Monster}
d:/cygwin/home/tester/hi_Girl_you/data
$
剩下一个就是大小写的问题了
>ksh
$ path=d:/cygwin/home/tester/hi_Monster_you/data
$ echo ${path%[Mm][oO][nN][Ss][tT][Ee][Rr]*}Girl${path##*[Mm][oO][nN][Ss][tT][Ee][Rr]}
d:/cygwin/home/tester/hi_Girl_you/data
$ path=d:/cygwin/home/tester/hi_MonsteR_you/data
$ echo ${path%[Mm][oO][nN][Ss][tT][Ee][Rr]*}Girl${path##*[Mm][oO][nN][Ss][tT][Ee][Rr]}
d:/cygwin/home/tester/hi_Girl_you/data
$ path=d:/cygwin/home/tester/hi_MonSter_you/data
$ echo ${path%[Mm][oO][nN][Ss][tT][Ee][Rr]*}Girl${path##*[Mm][oO][nN][Ss][tT][Ee][Rr]}
d:/cygwin/home/tester/hi_Girl_you/data
$ path=d:/cygwin/home/tester/hi_MoNsTeR_you/data
$ echo ${path%[Mm][oO][nN][Ss][tT][Ee][Rr]*}Girl${path##*[Mm][oO][nN][Ss][tT][Ee][Rr]}
d:/cygwin/home/tester/hi_Girl_you/data
$ path=d:/cygwin/home/tester/hi_MonsterMONSTER_you/dataMonster
$ old=$path
$ new=""
$ while [[ "$old" = *[Mm][oO][nN][Ss][tT][Ee][Rr]* ]]; do
> new=${new}${old%%[Mm][oO][nN][Ss][tT][Ee][Rr]*}Girl
> old=${old#*[Mm][oO][nN][Ss][tT][Ee][Rr]}
> done
$ new=$new$old
$ echo $new
d:/cygwin/home/tester/hi_GirlGirl_you/dataGirl
$
这个ksh版本古老,substitution都不支持。
可能最后只好用awk了(唯一一个系统里有的大杀器)。