2011-09-08 32 views
3

我想要的非常簡單。給定一個字符串'這是我的測試字符串',我想從第二個位置返回到第二個位置的子字符串。例如: substring 'this is my test string' 1,-1。我知道我可以使用剪切從字符串的開頭獲取內容,但我不確定如何從字符串的末尾輕鬆計算。幫幫我?如何獲得在Bash中使用正負索引的子串

回答

12

原來我可以使用awk如下做到這一點很容易:

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

+2

請注意,這將返回:「他是我的測試字符串」。輸入字符串(「g」)中的最後一個字符仍然存在。這是因爲[substr()]的第三個參數(https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#index-substr_0028_0029-function)指定了所需的輸出字符串,而不是索引。因此,我認爲這是正確的答案: 'echo'這是我的測試字符串'| awk'{print substr($ 0,2,length($ 0)-2)}'' – nofinator

+0

@nofinator將來,您可以編輯帖子,當你看到這樣的錯別字。 – Eli

3

在awk中,蟒蛇,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

+0

[在算術擴展使用反引號(反引號)已經由雙括號取代 - ( (...))和$((...)) - 以及非常方便的構建。](http://tldp.org/LDP/abs/html/arithexp.html) –

+0

@Maxim謝謝爲了學校!我相應地更新了我的答案。 – AlG

+0

現在看起來很漂亮! ) –

2

你可以只是單純bash

做到這一點
$ string="i.am.a.stupid.fool.are.you?" 
$ echo ${string: 2:$((${#string}-4))} 
am.a.stupid.fool.are.yo 
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}" 
} 
相關問題