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

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

只是玩正则表达式来学习。为什么它与其他文件匹配: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
aabbccdd抄送
阿布DDBB
阿卡阿
亚加德
阿达阿
添加ccddccdd
添加
$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
   啊啊啊     阿布    阿巴阿    阿布  aabbccdd  aabbccdd抄送  阿布DDBB
阿卡阿   亚加德   阿达阿  添加ccddccdd  添加ee 错误排序 pytest.py 测试
vimtest.sh 测试
$ ls | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"

啊啊啊
阿布
阿巴阿
阿布
aabbccdd
aabbccdd抄送
阿布DDBB
阿卡阿
亚加德
阿达阿
添加ccddccdd
添加
错误排序
pytest.py
测试
测试文件
维姆测试
$

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



阿布
阿布

阿布
aabbccdd
aabbccdd
阿布
阿拉伯联合酋长国

亚加德
添加

添加ccdd
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 匹配。

由于第一行和第二行在 (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

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

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

答案2

grep不是匹配像...这样的文件errsort与该行匹配,并且它实际匹配的唯一内容是(aa)(由于 ,其他所有内容都是可选的?)。因为你选择ls -xls 的输出是一条长线aa比赛。

为什么不匹配的替代组显示更多我无法理解的文件,可能是egrep 中的错误。

相关内容