【问题标题】:Get substring of a string in korn shell在 korn shell 中获取字符串的子字符串
【发布时间】:2015-09-25 04:01:15
【问题描述】:

我必须使用 ksh88 提取子字符串。 (顺便说一句,查找 ksh $KSH_VERSION 版本的简单方法对我不起作用。我不得不使用

 [ "`echo "\c" | grep c`" ] && echo ksh93 || echo ksh88

我尝试使用命令echo ${stringvariable : 2: 2} 但它显示bad substitution。我是 Unix 世界的新手。这是我为得到结果所做的:

我已经使用 PUTTY 登录到 Unix 并输入了上述命令。我也尝试了第一个 ksh 命令,然后是我的命令,但仍然没有成功。是不是我做错了什么?

另外,如果我希望子字符串从位置 2 开始直到结束,该怎么做?

【问题讨论】:

    标签: unix ksh


    【解决方案1】:

    空格在 shell 中很重要。你应该使用

    $ stringvariable="foobar"
    $ echo ${stringvariable:2:2}
    ob
    

    注意:这适用于 ksh93,不适用于 ksh88

    如果你的单词是空格分隔的,你可以使用set:

    $ stringvariable="foo bar baz zap"
    $ set -- $stringvariable
    $ echo $3
    baz
    

    这应该始终优先于 cut 的无用分叉。使用cut 获取字符串中的字符相当于使用 40 吨卡车购买和运输一块方糖。

    【讨论】:

    • doesnt work :( 同样的错误。替换错误。第二个选项效果很好。但是你能解释一下第二行“set --”的作用吗?
    • @user 是的,它确实有效,我提供了证据。如果它对您不起作用,则说明您没有使用当前的 ksh。 set 命令设置位置参数。字符串变量在IFS 中的字符处拆分(通常为空白、换行符、制表符),然后分配给 $1 等。
    • 感谢@Jens。如问题中所述,我有ksh88。即使我不知道为什么它不适合我。
    • @user1016198 这就解释了。是 ksh93 引入了子串提取,见 kornshell.com/doc/ksh93.html
    • @mlwacosmos 你的shell是ksh93吗?它不适用于 ksh88。
    【解决方案2】:

    我找到了另一个对我有用的解决方案。无法找到问题本身的解决方案不起作用的原因。

    这对我有用:

    str1="get word from this-text"
    

    得到第二个单词。 -d 是分隔符(这里是空格)

    str2=`echo $str1 | cut -d" " -f 2`
    
    echo $str2
    word
    

    从第 5 个开始获得 3 个字符

    str2=`echo $str1 | cut -b 5-3`
    echo $str2
    wor
    

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多