例如,一個字串有: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*
最初的重複字串被正確刪除,但接下來的四個反斜線僅轉換為兩個。