앞이나 뒤에서 가장 긴 연속 문자 시퀀스를 제거합니다.

앞이나 뒤에서 가장 긴 연속 문자 시퀀스를 제거합니다.

예를 들어, 문자열에는 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개로 변환됩니다.

관련 정보