2015-11-01 72 views
1

我有如下因素字符串的字符串:aaaccbbaabbbb字符串操作与前缀

我需要或者下降前AAA的或字符序列在后面BBBB的。我试过resString=(${resString%%b*b})其中resString是aaaccbbaabbbb变成了aaaccbbaa。但我需要将已删除的bbbb保存到一个文件中。有没有办法反转resString=(${resString%%b*b})的结果以获得bbbb的文件。我已经尝试过使用##操作,但是这很麻烦,因为我只需要在字符串的前面或后面重复。

+1

执行剥离,然后用结果剥夺自行关闭的前最初的变量,你会得到你在第一步中被剥离的位。 –

+0

@EtanReisner这是一个很好的主意,我经历了这么多小时的编程之后永远都不会教。非常感谢! –

+0

尝试'resString =〜。*(b +)$; resString = $ {BASH_REMATCH [1]}' – Gene

回答

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 
+0

它仍然具有删除场景aaabbbbaaaa或bbbaaabbb中的整个字符串的相同问题。 –

+0

@HazinC。回答编辑。现在应该工作。 – 2015-11-02 05:33:20

+0

现在它就像一个魅力!感谢您的详细解答。 –

2

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

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

这将打印bbbb

2

您可以使用参数扩展与延伸的通配:

#!/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" 
+0

我遇到了'prefix_rest = $ {s ## +(a)}'这行不行的问题 –

+0

我用'prefix_rest = $ {s ## *(a)}'修正了它。无论如何,谢谢你的回答,这很清楚并且有很大的帮助。 –

+0

@HazinC .:什么字不起作用? – choroba