带有前缀的Bash中的字符串操作

时间:2015-11-01 22:07:42

标签: string bash

我有一个包含以下字符串的字符串:aaaccbbaabbbb

我需要放弃前面的aaa或后面的bbbb中的字符序列。我已尝试将resString=(${resString%%b*b}) ressstring aaaccbbaabbbb变为aaaccbbaa。但我需要将删除的bbbb保存到文件中。有没有办法反转resString=(${resString%%b*b})的结果以获取文件中的bbbb。我尝试使用##操作,但是这样麻烦,因为我只需要在String的前面或后面重复。

3 个答案:

答案 0 :(得分:2)

您可以使用bash正则表达式匹配:

resString='abababbbb'
if [[ $resString =~ [^b](b+)$ ]] ; then      
  resString=${BASH_REMATCH[1]}
fi
echo $resString

这会打印bbbb

答案 1 :(得分:2)

您可以使用扩展globbing参数扩展:

#!/bin/bash
shopt -s extglob          # Turn extended globbing on.

s=aaaccbbaabbbb

prefix=${s%%[^a]*}        # Remove everything from the first non-"a".
prefix_rest=${s##+(a)}    # Remove all a's at the beginning.

suffix=${s##*[^b]}        # See above.
suffix_rest=${s%%+(b)}

[[ $prefix$prefix_rest == $s ]] || echo Wrong prefix
[[ $suffix_rest$suffix == $s ]] || echo Wrong suffix

echo "$prefix : $prefix_rest"
echo "$suffix_rest : $suffix"

答案 2 :(得分:1)

好的,使用${//}的全新方法。

完全自动,它会找到第一个字符,哪个是最后一个字符。
通过这套装置,它可以在前面选择跑步并在后面跑动 当然,您需要编辑程序以选择您需要将哪些部分发送到文件,打印或其他任何部分。我希望你能完成这部分工作。

这似乎适用于任何字符串(甚至重复的字符):

#!/bin/bash

a=(aaaccbbaabbbb aaabbbbaaaa abababbbb bbbaaabbb aaaaaa aaabbbbaaaa)

for resString in "${a[@]}"; do

    echo
    echo "String   :$resString:"
    l="$((2+${#resString}))"

    frontchar=${resString:0:1}         ; printf "%s%-${l}s\n" "Frontchar" ":$frontchar:"
    backchar=${resString:0-1:1}        ; printf "%s%${l}s\n"  "Backchar " ":$backchar:"
    head="${resString/%[^$frontchar]*}"; printf "%s%-${l}s\n" "head     " ":$head:"
    tail="${resString/#*[^$backchar]}" ; printf "%s%${l}s\n"  "tail     " ":$tail:"

    preffix="${resString%$tail}"       ; printf "%s%-${l}s\n" "preffix  " ":$preffix:"
    suffix="${resString#$head}"        ; printf "%s%${l}s\n"  "suffix   " ":$suffix:"

    echo "Using the head/suffix  value: $head -- $suffix"
    echo "Using the preffix/tail value: $preffix -- $tail"
done

运行它,你得到:

String   :aaabbbbaaaa:
Frontchar:a:
Backchar           :a:
head     :aaa:
tail            :aaaa:
preffix  :aaabbbb:
suffix      :bbbbaaaa:
Using the head/suffix  value: aaa -- bbbbaaaa
Using the preffix/tail value: aaabbbb -- aaaa


String   :aaaccbbaabbbb:
Frontchar:a:
Backchar             :b:
head     :aaa:
tail              :bbbb:
preffix  :aaaccbbaa:
suffix      :ccbbaabbbb:
Using the head/suffix  value: aaa -- ccbbaabbbb
Using the preffix/tail value: aaaccbbaa -- bbbb


String   :abababbbb:
Frontchar:a:
Backchar         :b:
head     :a:
tail          :bbbb:
preffix  :ababa:
suffix    :bababbbb:
Using the head/suffix  value: a -- bababbbb
Using the preffix/tail value: ababa -- bbbb


String   :aaaaaa:
Frontchar:a:
Backchar      :a:
head     :aaaaaa:
tail     :aaaaaa:
preffix  ::
suffix         ::
Using the head/suffix  value: aaaaaa --
Using the preffix/tail value:  -- aaaaaa