임의의 양의 텍스트가 일치 항목에 포함될 수 있는 선택적 텍스트의 이전 블록이 있는 가장자리 고정 텍스트를 검색하고 싶습니다. 예를 들어, 내가 , , , , , 를 찾으려고 ^xyz
하지만 수락하려고 한다고 가정해 보겠습니다 .^wxyz
^vwxyz
^uvwxyz
^tuvwxyz
^stuvwxyz
^rstuvwxyz
다른 가능성은 없어[r-w]
(실제 검색에서는 선행 문자의 실제 블록이 이 단순화된 예와 같이 알파벳 순서로 되어 있지 않기 때문에 단순히 정규식 문자 시퀀스를 사용할 수 없습니다 .) egrep '^r?s?t?u?v?w?xyz'
이 검색을 작성하는 다른 방법이 있습니까? 선택적 플래그( ?
)를 각 요소에 개별적으로 적용하는 대신 전체 시퀀스에 간단히 적용할 수 있습니까?
편집하다:
다음은 보다 현실적인 데이터 예입니다. 일치시킬 전체 텍스트는 AZHDEOIMOSJDJKEJLCN입니다. 그러나 문자는 왼쪽 끝에서 다양한 각도로 누락되므로 다음 사항이 모두 일치해야 합니다.
^AZHDEOIMOSJDJKEJLCN
^ZHDEOIMOSJDJKEJLCN
^HDEOIMOSJDJKEJLCN
^DEOIMOSJDJKEJLCN
^EOIMOSJDJKEJLCN
^OIMOSJDJKEJLCN
^IMOSJDJKEJLCN
^MOSJDJKEJLCN
^OSJDJKEJLCN
^SJDJKEJLCN
^JDJKEJLCN
^DJKEJLCN
^JKEJLCN
^KEJLCN
따라서 잔차 KEJLCN
는 필수이고 그 이전의 모든 것은 선택 사항입니다. 그러나 단순히 grep
for를 사용할 수는 없습니다. KEJLCN
인스턴스가 줄의 시작 부분( ^
)에만 고정되고 선택적으로 위에 나열된 다른 문자가 앞에 오기를 원하기 때문입니다. 또한 검색 문자열은 변수에 있으며 KEJLCN
스크립트의 하위 문자열 작업을 통해 최소 잔여물(예: )이 추출됩니다(예: egrep
검색 텍스트에 대한 시스템 명령으로 실행되는 Perl 환경에서는 $query
기본 텍스트가 포함됩니다). substr($query,-6)
이면 선택적인 이전 텍스트가 ) 안에 표시됩니다 substr($query,0,length($query)-6
. 따라서 이 솔루션은 문자열 리터럴뿐만 아니라 변수 형식의 정규식에서도 작동합니다.
답변1
grep '[[:lower:]]*xyz'
이 패턴과 일치하는 모든 행이 반환됩니다. 그러나 물론 이는 명시적인 문자 순서와 일치하지 않습니다.
그러나 이는 귀하가 해결한 문제인 것 같습니다.
grep -f - <<\STRINGS /dev/fd/3 3<<\DATA
^ZHDEOIMOSJDJKEJLCN
^HDEOIMOSJDJKEJLCN
^DEOIMOSJDJKEJLCN
^EOIMOSJDJKEJLCN
^OIMOSJDJKEJLCN
^IMOSJDJKEJLCN
^MOSJDJKEJLCN
^OSJDJKEJLCN
^SJDJKEJLCN
^JDJKEJLCN
^DJKEJLCN
^JKEJLCN
^KEJLCN
STRINGS
SJDJKEJLCN
JDJKEJLCN
o;aidsfjoasjif
KKEJnotLCN
DATA
산출
SJDJKEJLCN
JDJKEJLCN
프로그래밍 방식으로 동일한 조회 테이블을 생성하려는 경우...
grep -f - <<STRINGS /dev/fd/3 3<<\DATA
$(
MATCH=ZHDEOIMOSJDJKEJLCN
until [ ${#MATCH} -lt ${MINLEN=6} ]
do printf '^%s\n' "$MATCH"
MATCH=${MATCH#?}
done
)
STRINGS
SJDJKEJLCN
JDJKEJLCN
o;aidsfjoasjif
KKEJnotLCN
DATA
산출
SJDJKEJLCN
JDJKEJLCN