從前面或後面刪除最長的連續字元序列

從前面或後面刪除最長的連續字元序列

例如,一個字串有: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*

最初的重複字串被正確刪除,但接下來的四個反斜線僅轉換為兩個。

相關內容