淘客熙熙

主题:【讨论】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但不想用)

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

    • 家园 你确定是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 里面就有这个功能

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

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

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

分页树展主题 · 全看首页 上页
/ 2
下页 末页


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

Copyright © cchere 西西河