[英]Why is grep giving unexpected result?
我的文件擴展名為.m和.slx。 我想使用grep從svn日志中檢查修改過的m文件:
svn status | grep "M " | grep ".m"
我懂了
M foo.m
M model1.slx.
我希望只看到foo.m。 但是為什么我也看到model1.slx? 它應該被第二個grep過濾掉。
您看到的問題是因為.
是正則表達式上下文中的元字符,需要對其進行轉義以剝奪其特殊含義(以匹配任何字符)。
如果要列出僅以.m
和.slx
結尾的文件還是以M
開頭並以.m
結尾的文件,您的要求不清楚。 對於前者,請使用下面的建議;對於后者,請使用grep ^M.*\\.m$
您可以通過啟用-E
擴展正則表達式支持模式來使用一個grep
svn status | grep -E '(\.m|\.slx)$'
交替|
運算符默認在ERE模式下啟用,但在使用BRE(基本正則表達式)模式時需要轉義
svn status | grep '\.m$\|\.slx$'
的.
匹配任何字符。 根據POSIX的regex規則 .
字符:
匹配任何單個字符(許多應用程序不包括換行符,而哪些字符被視為換行符恰好是風味,字符編碼和平台特定的,但是可以安全地假定包括換行符)。 在POSIX括號表達式中,點字符與文字點匹配。 例如,ac匹配“ abc”等,但是[ac]僅匹配“ a”,“。”或“ c”。
匹配一個.
字符不在[]
,您需要使用\\
字符對其進行轉義:
\.m
將匹配文字.m
。
我想使用grep從svn日志中檢查修改過的m文件:
$ svn status | grep ^M.*\.m$
M foo.m
即。 行以M
開頭,以.m
結尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.