이 정규식이 이상한 파일과 일치하는 이유는 무엇입니까?

이 정규식이 이상한 파일과 일치하는 이유는 무엇입니까?

정규식을 가지고 놀면서 배워보세요. errsort, pytest.py 등 다른 파일과 일치하는 이유는 무엇입니까? 다른 두 파일과 일치하도록 두 번째 줄 끝에 물음표를 추가합니다. 또한 grep 기본 표현식을 사용해 보았습니다.

감사해요!

$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)"
aa       aaaa       aabb     aabbaa     aabbbb    aabbccdd  aabbccddcc  
aabbddbb
aaccaa   aaccdd   aaddaa   aaddccddccdd  aaddee  errsort   pytest.py   TEST
$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
aa       aaaa     aabb    aabbaa        aabbbb  aabbccdd  aabbccddcc  aabbddbb
aaccaa   aaccdd   aaddaa  aaddccddccdd  aaddee  errsort   pytest.py   TEST
test.sh  vimtest

$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
$ grep --version
grep (GNU grep) 3.7
$ ls | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)"

아아아아
아부
아바
아부
aabbccdd
aabbccddCC
아부DDBB
아카아
야가드
아다
추가ccddccdd
다음에 추가
$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
   아아아아     아부    아바    아부  aabbccdd  aabbccddCC  아부DDBB
아카아   야가드   아다  추가ccddccdd  다음에 추가ee pytest.py 테스트 정렬 오류
vimtest.sh 테스트
$ ls | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"

아아아아
아부
아바
아부
aabbccdd
aabbccddCC
아부DDBB
아카아
야가드
아다
추가ccddccdd
다음에 추가
잘못된 정렬
pytest.py
시험
테스트 파일
Wim 테스트
$

$ ls | egrep -io "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"



아부
아부

아부
aabbccdd
aabbccdd
아부
아랍 에미리트

야가드
다음에 추가

addccdd
ccdd
다음에 추가

이것은 색상을 제공하지 않지만 내 화면의 굵은 글씨는 패턴 일치라고 생각되는 것을 나타 내기 위해 빨간색입니다.
하단 파일에는 빨간색이 없습니다.
-x를 제거하면 첫 번째 출력에 영향을 미칩니다. -o 도움이 많이 됐어요!

답변1

선택적 매칭은 (ccdd)?바로 선택 사항입니다.

일치하는 텍스트는 다음과 같습니다.비어 있는, 그러나 이것은 여전히 ​​일치, 일치가 있는 줄입니다.

$ ls -x
aa   aaaa       aabb  aabbaa   aabbbb   aabbccdd  aabbccddcc  aabbddbb  aaccaa  aaccdd  aaddaa  aaddccddccdd  aaddee
errsort  pytest.py  TEST  test.sh  vimtest

$ ls -x | cat
aa   aaaa     aabb    aabbaa    aabbbb  aabbccdd  aabbccddcc  aabbddbb
aaccaa   aaccdd   aaddaa  aaddccddccdd  aaddee  errsort   pytest.py   TEST
test.sh  vimtest

ls출력이 파이프되면 변경된다는 점을 이해하는 것이 중요합니다 . 이제 grep과 일치하는 세 줄이 있습니다.

첫 번째와 두 번째 줄이 (여러 개) 일치하므로 aa두 줄이 모두 인쇄됩니다.

$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)"
aa   aaaa     aabb    aabbaa    aabbbb  aabbccdd  aabbccddcc  aabbddbb
aaccaa   aaccdd   aaddaa  aaddccddccdd  aaddee  errsort   pytest.py   TEST

$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
aa   aaaa     aabb    aabbaa    aabbbb  aabbccdd  aabbccddcc  aabbddbb
aaccaa   aaccdd   aaddaa  aaddccddccdd  aaddee  errsort   pytest.py   TEST
test.sh  vimtest

표시된 대로 (ccdd)?세 번째 줄은 .

귀하의 파일 목록이 올바른 형식이 아니라고 가정합니다.

답변2

grep아니요성냥...와 같은 파일은 errsort해당 줄과 일치하며 실제로 일치하는 유일한 것은 (aa)(다른 모든 것은 선택 사항이므로 ?)입니다. ls -xls의 출력을 선택했기 때문에긴 줄그리고 aa경쟁.

일치하지 않는 대체 그룹이 내가 이해할 수 없는 더 많은 파일을 표시하는 이유는 egrep의 버그일 수 있습니다.

관련 정보