为什么这个正则表达式会匹配奇怪的文件?

kse*_*ick 1 grep

只是玩正则表达式来学习。为什么它与其他文件匹配: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
Run Code Online (Sandbox Code Playgroud)
$ ls | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)"
 aa 
aaaa 
aabb 
aabbaa 
aabbbb 
aabbccdd 
aabbccdd cc
 aabb ddbb
 aaccaa 
aaccdd 
aaddaa 
aaddccddccdd 
aadd ee
$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
aa    aaaa      aabb     aabbaa     aabbbb   aabbccdd   aabbccdd cc   aabb ddbb
 aaccaa    aaccdd    aaddaa   aaddccddccdd   aadd ee errsort pytest.py 测试
vimtest.sh 测试
$ ls | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
aa 
aaaa 
aabb 
aabbaa 
aabbbb 
aabbccdd 
aabbccdd cc
 aabb ddbb
 aaccaa 
aaccdd 
aaddaa 
aaddccddccdd 
aadd ee
错误排序
pytest.py
测试
测试文件
维姆测试
$

$ ls | egrep -io "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
aa 
aa 
aa 
aabb 
aabb 
aa 
aabbbb 
aabbccdd 
aabbccdd 
aabb 
aacc 
aa 
aaccdd 
aadd 
aa 
aaddccdd 
ccdd 
aadd

这不会给你颜色,但我的屏幕上的粗体是红色的,以指示我认为的模式匹配。
底部的文件没有任何红色。
删除 -x 确实影响了第一个的输出。-o 有很大帮助!

Qua*_*tal 5

可选匹配(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
Run Code Online (Sandbox Code Playgroud)

重要的是要理解,当ls输出通过管道传输时,它会发生变化。现在有三行与 grep 匹配。

由于第一行和第二行在 (several) 上匹配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
Run Code Online (Sandbox Code Playgroud)

如图所示,由于 .第三行在空字符串上获得了匹配(ccdd)?

我假设您的文件列表的格式不正确。