如何在Bash中使用正负索引获取子字符串

时间:2011-09-08 20:23:18

标签: bash unix

我想要的很简单。给定一个字符串'这是我的测试字符串',我想将子字符串从第二个位置返回到第二个位置。就像是: substring 'this is my test string' 1,-1。我知道我可以使用cut从字符串的开头获取东西,但我不确定如何从字符串的末尾轻松计算。帮助

4 个答案:

答案 0 :(得分:17)

原来我可以很容易地使用awk执行此操作,如下所示:

echo 'this is my test string' | awk '{ print substr( $0, 2, length($0)-2 ) }'

答案 1 :(得分:3)

在awk,python,perl等中更清洁,但这是一种方法:

#!/usr/bin/bash

msg="this is my test string"
start=2
len=$((${#msg} - ${start} - 2))

echo $len

echo ${msg:2:$len}

结果为is is my test stri

答案 2 :(得分:2)

您只需使用纯bash

即可
$ string="i.am.a.stupid.fool.are.you?"
$ echo ${string:  2:$((${#string}-4))}
am.a.stupid.fool.are.yo

答案 3 :(得分:1)

Look ma,没有全局变量或分叉(显而易见的printf除外)并经过全面测试:

substring()
{
    # Extract substring with positive or negative indexes
    # @param $1: String
    # @param $2: Start (default start of string)
    # @param $3: Length (default until end of string)

    local -i strlen="${#1}"
    local -i start="${2-0}"
    local -i length="${3-${#1}}"

    if [[ "$start" -lt 0 ]]
    then
        let start+=$strlen
    fi

    if [[ "$length" -lt 0 ]]
    then
        let length+=$strlen
        let length-=$start
    fi

    if [[ "$length" -lt 0 ]]
    then
        return
    fi

    printf %s "${1:$start:$length}"
}