![为什么这个正则表达式会匹配奇怪的文件?](https://linux22.com/image/209963/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%BC%9A%E5%8C%B9%E9%85%8D%E5%A5%87%E6%80%AA%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
只是玩正则表达式来学习。为什么它与其他文件匹配: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 -x
ls 的输出是一条长线和aa
比赛。
为什么不匹配的替代组显示更多我无法理解的文件,可能是egrep 中的错误。