例如,一个字符串有: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*
最初的重复字符串被正确删除,但接下来的四个反斜杠仅转换为两个。