Grep

為什麼這個正則表達式匹配奇怪的文件?

  • August 29, 2022

只是玩正則表達式來學習。為什麼它與其他文件匹配: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)?.

我假設您的文件列表的格式不正確。

引用自:https://unix.stackexchange.com/questions/715283