从前面或后面删除最长的连续字符序列

从前面或后面删除最长的连续字符序列

例如,一个字符串有:aaaaabbaabaabbaa,我想修剪它,以便它删除前面的每个“a”直到“b”,所以结果必须是bbaabaabbaa。

答案1

看看这些部分参数扩展模式匹配man 1 bash

$ shopt -s extglob # enable extended glob operators
$ s=aaaaabbaabaabbaa
$ echo "${s##*(a)}"
bbaabaabbaa

$ s=bananasssssssss
$ echo "${s%%*(s)}"
banana

答案2

使用 GNU sed

sed -e 's/^\(.\)\1\{1,\}//'

匹配并删除在行开头至少重复一次的任何字符。它用于^\(.\)匹配第一个字符,然后\1\{1,\}通过向后引用该匹配来匹配 1 个或多个字符。

如果您只想匹配第一个字符的 1 次或多次重复,则可以仅使用sed -e 's/^\(.\)\1\+//',但\{1,\}如果需要,可以轻松地将表单修改为 2 次或更多或 3 次或更多等。

答案3

只需两行:

$ a="aaaaabbaabaabbaaddd" 
$ echo "${a#"${a%%[^"${a:0:1}"]*}"}"
bbaabaabbaaddd

动作说明:

                  "${a:0:1}"         ## Select the first char of $a: ='a'
                [^          ]*       ## All chars not 'a' from the end. ='bbaabaabbaaddd'
          "${a%%              }"     ## Remove 'bbaabaabbaaddd' from the end of $a. ='aaaaa'  
echo "${a#                      }"   ## Remove 'aaaaa' from start of $a and echo it.

(-)两个扩展都需要引号才能正确处理 * 和 /。仍然存在反引号通常被错误处理的问题:

a="\\\\*\\\\*****vdf*"; echo "${a#"${a%%[^"${a:0:1}"]*}"}"

将打印:

*\\*****vdf*

最初的重复字符串被正确删除,但接下来的四个反斜杠仅转换为两个。

相关内容