앞이나 뒤에서 가장 긴 연속 문자를 삭제합니다.

앞이나 뒤에서 가장 긴 연속 문자를 삭제합니다.

예를 들어 문자열에는 다음이 있습니다. 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개 이상의 반복만 일치시키려는 경우 just를 사용할 수 있지만 필요한 경우 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개로 변환되었습니다.

관련 정보