簡體   English   中英

為什么grep會產生意外結果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM