我屬性文件grep的精確匹配不工作
myprop2=this is with <br/>
當我想爲什麼發現myprop2到grep爲<br>
grep "^myprop.*=.`*<br>*`" MyProject.properties | xargs | cut -d '=' -f 1
?
注:我發現的<br>
代替<br/>
(沒有結束標記)
我屬性文件grep的精確匹配不工作
myprop2=this is with <br/>
當我想爲什麼發現myprop2到grep爲<br>
grep "^myprop.*=.`*<br>*`" MyProject.properties | xargs | cut -d '=' -f 1
?
注:我發現的<br>
代替<br/>
(沒有結束標記)
右角支架使得*
後0次以上,從而安全地在比賽中被忽略。我想你的意思是...>.*
此外,使用前瞻就可以消除一些管道
grep -oP "myprop.(?==.*<br>.*)" file
將給予同樣沒有xargs的切
你的雙引號字符串包含反引號大約*<br>*
(command substitution的一個實例),這意味着Bash將嘗試執行*<br>*
作爲命令 - 這會因各種原因而失敗 - 並將表達式擴展爲由該命令生成的stdout輸出。
由於失敗命令不產生標準輸出輸出時,`...`
表達式擴展到null(空)串,這意味着grep
將看到以下字符串文字:
^myprop.*=."
任何行開頭myprop
,最後是=
,並且至少有1個字符。與此正則表達式匹配,而不管以下內容 - 這就是myprop2
行匹配的原因。
如果反引號的意思是一致的文字,你既可以逃脫他們爲\`
或使用單 -quoted字符串代替。
(如果您認爲*
字符必須在帶引號的字符串中轉義以便從字面上理解:它們不會 - 只有未加引號使用需要轉義)。
然而,karakfa's helpful answer正確意味着,即使你不括在反引號*<br>*
,以下>
與重複符號*
意味着任何的>
實例的數量 - 包括無 - 匹配。
由於grep
匹配默認線的子串,這有效地相匹配任何其餘部分的線,其中包括與/>
開始,因此其相匹配<br/>
太。
因此,雖然下面>
與.*
代替*
不解決這個問題,這是沒有必要的 - 與>
將做結束的正則表達式。
他GNUgrep
溶液(因爲只有GNU grep
支持-P
選項使支持PCREs,使這些特徵作爲先行斷言),因此可以簡化爲:
grep -oP 'myprop.*(?==.*<br>)' MyProject.properties
注使用單個引號,這是不需要插值的字符串的更好選擇,以保證其原樣使用。
如果使用GNU grep
不是一個選項,使用(注意,沒有理由使用xargs
):
grep '^myprop.*=.*<br>' MyProject.properties | cut -d '=' -f 1
另外,使用awk
:
awk -F= '$1 ~ /^myprop/ && $2 ~ /<br>/ { print $1 }' MyProject.properties
或者,如果這只是關於匹配值,不管屬性名稱:
awk -F= '$2 ~ /<br>/ { print $1 }' MyProject.properties
我只是喜歡你的答案......並感謝你付出的精力。帽子掉了! –
@NoviceUser:我很欣賞那些不錯的反饋;我很高興你找到了有用的答案。 – mklement0
太棒了! ..多謝... –
'grep'解決方案很有幫助,但你應該提到它需要_GNU_' grep'。雖然''*''解釋原則上是正確的,但OP更直接的問題是在_backticks_中封入'*
*'。 另外,儘管'>。*'而不是'> *'確實有效,但值得指出的是隻要'>'會執行,因爲該行的其餘部分不需要匹配。 – mklement0