淘客熙熙

主题:【讨论】ksh编程的一个问题 -- HAL

共:💬17 🌺4 新:
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 【讨论】ksh编程的一个问题

假设一个变量path记录了一个路径信息,比如

path=d:/cygwin/home/tester/hi_Monster_you/data

如何将路径中的Monster替换成Girl?

当然这个Monster可以出现在任意位置,可能重复.

限制条件:使用环境是嵌入式linux,不能用sed, perl, tr, cut等工具.大小写不敏感。(有awk但不想用)

家园 bash 里面就有这个功能

比如说,设定一个字符串 str1=testMonwork

然后你再 echo ${str1/Mon/Girl} 看看?

具体的花样可以参考一下这个:Manipulating String

家园 你确定是bash?

#! /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很多的,呵呵

家园 这个好,我都忘了呢,呵呵
家园 更正:不是bash, 是ksh; 大小写不敏感

问题的核心是要用最简单的方法去实现,最好是ksh自带的

ksh可以用这个match and cut,但是不能忽略大小写

${var%%}

${var##}

家园 sorry, it is ksh
家园 如果是 Korn shell 的话,有个 typeset

好像可以转换字符串,加上判断的话应该没有问题, ksh 不怎么用,只知道这些了。

家园 use variable expension

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

$

家园 这个思路很好,我就没想到用前后两次match

剩下一个就是大小写的问题了

家园 like this?

>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

家园 这样做比较笨重不灵活,而且还要考虑重复匹配的可能
家园 repeating--no problem

$ 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了(唯一一个系统里有的大杀器)。

家园 typeset我这个ksh不支持
家园 ksh不支持
全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河