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

String Bash中带前缀的字符串操作,string,bash,String,Bash,我有一个带有以下字符串的字符串:aaaccbaabbb 我需要删除前面的aaa或后面的bbbb中的字符序列。我尝试了resString=(${resString%%b*b})哪个resString是aaaccbaabbb变成了aaaccbaa。但我需要将删除的bbbb保存到一个文件中。是否有方法反转resString=(${resString%%b*b})的结果,以在文件中获取bbbb。我尝试过使用##操纵,但这是一个非常麻烦的问题,因为我只需要在字符串的前面或后面重复 可以使用bash正则表达

我有一个带有以下字符串的字符串:
aaaccbaabbb


我需要删除前面的aaa或后面的bbbb中的字符序列。我尝试了
resString=(${resString%%b*b})
哪个resString是
aaaccbaabbb
变成了
aaaccbaa
。但我需要将删除的bbbb保存到一个文件中。是否有方法反转
resString=(${resString%%b*b})
的结果,以在文件中获取
bbbb
。我尝试过使用##操纵,但这是一个非常麻烦的问题,因为我只需要在字符串的前面或后面重复

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

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

这将打印
bbbb

您可以使用bash regex匹配:

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

这将打印
bbbb

您可以使用扩展全局搜索的参数扩展:

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

您可以将参数扩展与扩展全局绑定一起使用:

#!/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"
好的,使用
${/}
的全新方法

它是完全自动的,它会查找哪个是第一个字符,哪个是最后一个字符。
有了这一套,它就能神奇地选择前面和后面的跑步路线。
当然,您需要编辑程序以选择确实需要发送到文件、打印或其他任何内容的部分。我希望你能做那部分工作

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

#/bin/bash
a=(aaccbbaabbbbaaabbbaaaa abababbbbbbbbbbaabababab aaaaaaabbbaaaa)
对于“${a[@]}”中的resString;做
回响
echo“字符串:$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:
前缀=“${resString%$tail}”;printf“%s%-${l}s\n“前缀”:$prefix:
后缀=“${resString#$head}”;printf“%s%${l}s\n”后缀“:$后缀:”
echo“使用头/后缀值:$head--$suffix”
echo“使用前缀/尾部值:$prefix--$tail”
完成
运行它,您将获得:

String:aaabbbaaaa:
Frontchar:a:
Backchar:a:
负责人:aaa:
尾部:aaaa:
前缀:aaabbb:
后缀:bbaaaa:
使用头/后缀值:aaa--bbbbaaaa
使用前缀/尾值:aaabbb--aaaa
字符串:aaaccbbaabbbb:
Frontchar:a:
Backchar:b:
负责人:aaa:
尾部:bbbb:
前缀:aaccbbaa:
后缀:ccbbaabbbb:
使用头/后缀值:aaa--ccbbaabbb
使用前缀/尾部值:aaccbbaa--bbbbbb
字符串:abababbbb:
Frontchar:a:
Backchar:b:
标题:a:
尾部:bbbb:
前缀:ababa:
后缀:bababb:
使用头/后缀值:a--babbb
使用前缀/尾部值:ababa--bbbb
字符串:AAAAA:
Frontchar:a:
Backchar:a:
标题:aaaa:
尾部:AAAAA:
前缀::
后缀::
使用头/后缀值:aaaaaa--
使用前缀/尾部值:--aaaaaa
好的,使用
${/}
的全新方法

它是完全自动的,它会查找哪个是第一个字符,哪个是最后一个字符。
有了这一套,它就能神奇地选择前面和后面的跑步路线。
当然,您需要编辑程序以选择确实需要发送到文件、打印或其他任何内容的部分。我希望你能做那部分工作

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

#/bin/bash
a=(aaccbbaabbbbaaabbbaaaa abababbbbbbbbbbaabababab aaaaaaabbbaaaa)
对于“${a[@]}”中的resString;做
回响
echo“字符串:$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:
前缀=“${resString%$tail}”;printf“%s%-${l}s\n“前缀”:$prefix:
后缀=“${resString#$head}”;printf“%s%${l}s\n”后缀“:$后缀:”
echo“使用头/后缀值:$head--$suffix”
echo“使用前缀/尾部值:$prefix--$tail”
完成
运行它,您将获得:

String:aaabbbaaaa:
Frontchar:a:
Backchar:a:
负责人:aaa:
尾部:aaaa:
前缀:aaabbb:
后缀:bbaaaa:
使用头/后缀值:aaa--bbbbaaaa
使用前缀/尾值:aaabbb--aaaa
字符串:aaaccbbaabbbb:
Frontchar:a:
Backchar:b:
负责人:aaa:
尾部:bbbb:
前缀:aaccbbaa:
后缀:ccbbaabbbb:
使用头/后缀值:aaa--ccbbaabbb
使用前缀/尾部值:aaccbbaa--bbbbbb
字符串:abababbbb:
Frontchar:a:
Backchar:b:
标题:a:
尾部:bbbb:
前缀:ababa:
后缀:bababb:
使用头/后缀值:a--babbb
使用前缀/尾部值:ababa--bbbb
字符串:AAAAA:
Frontchar:a:
Backchar:a:
标题:aaaa:
尾部:AAAAA:
前缀::
后缀::
使用头/后缀值:aaaaaa--
使用前缀/尾部值:--aaaaaa

进行剥离,然后使用结果将其自身从原始变量的前面剥离出来,这样就得到了在第一步剥离的位。@EtanReisner这是一个好主意,经过这么多小时的编程,我从来没有教过这个主意。谢谢!尝试
resString=~.*(b+)$;resString=${BASH_REMATCH[1]}
@EtanReisner我想你可以把这个评论作为答案来写。@RodneySalcedo如果它是一个好的答案,它会想要代码(以及每一步的输出),而我没有时间坐下来写它。进行剥离,然后使用结果