예를 들어, 문자열에는 aaaaabbaabaabbaa가 있습니다. "b"까지 앞의 모든 "a"를 제거하도록 잘라내기를 원하므로 결과는 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*
초기 중복 문자열은 올바르게 제거되지만 다음 4개의 백슬래시는 2개로 변환됩니다.