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
$ 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 TEST test.sh vimtest $ 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 測試 測試.sh 測試 $
$ ls | egrep -io "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?" **aa** **aa** **aab** **aabb** **aa** **aabbbb** **aabbccdd** **aabbccdd** **aabb** **aacc** **aa** **aaccdd** **aadd** **aa** **aaddccdd** **ccdd** **aadd** **_**
這不會給你顏色,但我螢幕上的粗體是紅色的,表示我認為的模式匹配。
底部的文件沒有任何紅色。
刪除 -x 確實影響了第一個的輸出。-o 有很大幫助!
一個可選的匹配
(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)?
.我假設您的文件列表的格式不正確。