예를 들어 문자열에는 다음이 있습니다. 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개로 변환되었습니다.