2015-04-12 91 views
0

我正在嘗試僅修剪以ltrim()作爲參數給出的字符串的左半部分。這是我現在的代碼。在bash中,如何修剪字符串的某個部分?

ltrim() 
{ 
     string=${1} 
     divider=$((${#string}/2)) 

     trimrule=${2} 

     string_left=${string:0:$divider} 
     string_right=${string:$divider} 

     echo ${string:$divider} ## My own quick debug lines 
     echo ${string:0:$divider} ## My own quick debug lines 

     if [ $# -ne 2 ] 
     then 
       printf "%d argument(s) entered. 2 required.\n" "$#" 
     else 
       while : 
       do 
         case $string_left in 
         ${2}*) string_left=${string_left#?} ;; 
         *${2}) string_left=${string_left%?} ;; 
         *) break ;; 
         esac 
       done 
       printf "Left side string is %s\n" "${string_left}" 
     fi 
} 

然而,當我進入ltrim abcdefghijklmnopq abc外殼返回如下:

ijklmnopq 
abcdefgh 
Left side string is bcdefgh 

所以我只丟了「一」這個字,而我希望得到「defgh」結果。我究竟做錯了什麼?

+0

你的邏輯。您需要刪除每次迭代中規則的字符數量。 – Mat

回答

2
function substr_remove() { 
    echo "${1//$2/}" 
} 

substr_remove carfoobar123foo456 foo 

輸出:爲實現將只與一個單個字符 「規定」 工作

 
carbar123456 
+1

substr_remove更好。 – Cyrus

+0

是的,明白了。你是對的!我仍然不熟悉字符串操作的操作符,我使用了太多的'sed'和'awk'。目前試圖讓他們流利。 – hek2mgl

+0

這正是我要找的。謝謝! –

2

你在尋找類似的東西嗎?

function ltrim() { 
    echo ${1##$2} 
} 

ltrim abcdefghijklmnopq abC# Prints: defghijklmnopq 
+0

哦太棒了!但是如果我使用'ltrim abcdefghijklmnopq def'呢?它會打印'abcghijklmnopq'嗎? –

+0

@RizkyFakkel不,它會保持字符串不變。 (試試看) – hek2mgl

+0

@RizkyFakkel:期望的輸出是什麼? – Cyrus