在纯粹的bash中删除某个字符的块

时间:2016-11-03 19:32:20

标签: bash

嘿,让我们说你有一个字符串" aabbaabbbaab"。如你所见,你有3块" b"。例如,如何删除b的第二个块,所以" bbb"?它应该把字符串变成:" aabbaaaab"。我试过到处寻找但我无法想到我的具体问题的正确语法。我需要在纯粹的bash中这样做,所以没有awk,sed等。

2 个答案:

答案 0 :(得分:1)

在替换所有出现的myString之后,应该打印bbb。有关bash中字符串操作的一些非常有用的提示和示例,请查看this站点。

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

答案 1 :(得分:1)

这是纯粹的bash:它逐个字符地迭代字符串。当它检测到它位于指定char的第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