2016-11-03 24 views
1

嘿所以讓我們說你有一個字符串「aabbaabbbaab」。正如你所看到的,你有3塊「b」。例如,我如何刪除第二塊b,所以「bbb」?它應該將字符串變成:「aabbaaaab」。我嘗試過尋找無處不在,但我不能爲我的具體問題想出正確的語法。我需要在純bash中做到這一點,所以沒有awk,sed等。刪除純bash中的某個字符的塊

+2

萬一你改變主意了 「沒有的sed」 的要求,這裏是我的GNU sed的回答是:'sed的「S/B \ + // 2'' – Aaron

+0

@亞倫嘿,如果我最終無法弄清楚如何做到這一點沒有sed我會用你的方法謝謝。 – foobarbaz

+1

爲什麼沒有sed或awk?這些是POSIX工具,並且在BASH出現的任何地方都有99.999%可能存在。 – dawg

回答

1

這裏是純粹的bash:它遍歷字符串逐個字符。當它檢測到它在指定字符的第n個塊中時,我們知道直到這裏的整個字符串都是我們想要的輸出的第一部分。當我們到達第n個街區時,我們知道弦的其餘部分是需要的。

remove_nth_block() { 
    local str=$1 char=$2 n=$3 
    local i count=0 prev prefix 
    for ((i=0; i<${#str}; i++)); do 
     if [[ ${str:i:1} = $char && $prev != $char ]]; then 
      ((++count == n)) && prefix=${str:0:i} 
     else 
      if [[ ${str:i:1} != $char && $prev = $char && $count -eq $n ]]; then 
       echo "$prefix${str:i}" 
       return 
      fi 
     fi 
     prev=${str:i:1} 
    done 
} 

然後

$ remove_nth_block aabbaabbbaab b 2 
aabbaaaab 
$ remove_nth_block aabbaabbbaab a 2 
aabbbbbaab 
+0

恭喜,我試圖做一個類似的解決方案,並放棄了挫折。如果沒有多樣化的工具箱,「bash」就不是一種很好的語言 – Aaron

+0

它也非常慢。 –

1

這應該打印myString在所有出現的bbb替換爲空。有關bash中字符串操作的一些非常有用的提示和示例,請查看this網站。

myString="aabbaabbbaab" 
echo ${myString//bbb/} 
+0

嘿謝謝你的回覆,我應該更具體。我需要能夠根據用戶輸入找到第N個塊。例如,如果我輸入「bb」,這意味着我需要找到b的第二個塊並刪除該塊。 – foobarbaz

相關問題