【问题标题】:Fetching last n characters of string in ksh在 ksh 中获取字符串的最后 n 个字符
【发布时间】:2014-08-24 13:32:15
【问题描述】:

假设我有一个变量name 保存一些字符串值

要获取最后 n 个字符,我们在 bash 中编写:

$ echo "${name: -n}"

ksh 中的等效方式是什么,我见过 sedawk 方法,但我正在寻找的是类似于 bash 的一行或管道解决方案来提取最后一个字符

到目前为止,这些都是错误和努力:

AB12 $ name="123456"

AB12 $ echo ${name:(-3)}
ksh: ${name:(-3)}: bad substitution

AB12 $ echo${name:0:-3}
ksh: echo${name:0:-3}: bad substitution

AB12 $ print ${name%?}
12345

AB12 $  echo "some string" | tail -c -1
tail: cannot open input

AB12 $ echo -n "my string discard"| tail -c -1
tail: cannot open input

AB12 $ echo "foo"| cut -c 1-2
fo

AB12 $ echo "foo"| cut -c -2
fo

AB12 $ echo $name
123456

AB12 $ echo "${name: -3}"
ksh: "${name: -3}": bad substitution

我目前在 Solaris - 如果这有帮助

【问题讨论】:

    标签: linux string shell solaris ksh


    【解决方案1】:

    你可以使用这个,比如 n=2(我们将在嵌套扩展中使用 2 个问号):

    $ var="this is my var"
    $ echo "${var#${var%??}}"
    ar
    

    说明

    这是一个嵌套扩展。

    扩展 ${var%%??} 嵌入在扩展 ${var# } 中。
    ${var#string} 扩展将切断与“字符串”匹配的变量开头的任何内容。所以我们在这种情况下说,从与${var%%??} 匹配的变量的开头删除任何内容。

    ${var%%??} 单独匹配示例中变量的“this is my v”,因为%% 扩展匹配变量末尾可能最长的匹配项。在这种情况下,两个正则表达式 ?'s。

    【讨论】:

    • dint 理解这部分 => var#${var%??} ?? :)
    • 这是一个嵌套扩展。扩展 ${var%%??} 嵌入在扩展 ${var# } 中。 ${var#string} 扩展将切断与“字符串”匹配的变量开头的任何内容。所以我们在这个例子中说,从与 ${var%%??} 匹配的变量的开头删除任何内容。就其本身而言,${var%%??} 匹配示例中变量的“this is my v”,因为 %% 扩展匹配变量末尾的最长可能匹配项。在这种情况下,两个正则表达式?希望对您有所帮助。
    • 这是获取 Korn Shell 脚本最后几个字符串字符的正确示例。非常感谢 :) 埃尔
    【解决方案2】:

    您的剪裁看起来不错,只需获得正确的偏移即可。

    #!/bin/ksh
    var="This is a string"
    n=2
    (( offset =  ${#var} - $n + 1 ))
    echo ${var} | cut -c ${offset}- 
    

    或作为单行者

    echo ${var} | cut -c $(expr  ${#var} - $n + 1 )-
    

    【讨论】:

      【解决方案3】:

      已经有一个公认的答案,但这里有另一种方法,使用 ksh 合理的可变量的概念:

      var="This is a test"
      typeset -R4 foo
      foo="${var}"
      echo "${foo}"
      

      如果超过长度,右(和左)对齐属性会导致截断,如果分配的值太短,则会导致填充。

      【讨论】:

        猜你喜欢
        • 2017-12-28
        • 2021-02-11
        • 1970-01-01
        • 2021-07-22
        • 2016-05-06
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        相关资源
        最近更新 更多