bash
  • shell
  • 2016-03-27 129 views 1 likes 
    1

    我屬性文件grep的精確匹配不工作

    myprop2=this is with <br/> 
    

    當我想爲什麼發現myprop2到grep爲<br>

    grep "^myprop.*=.`*<br>*`" MyProject.properties | xargs | cut -d '=' -f 1 
    

    注:我發現的<br>代替<br/>(沒有結束標記)

    回答

    2

    右角支架使得*後0次以上,從而安全地在比賽中被忽略。我想你的意思是...>.*

    此外,使用前瞻就可以消除一些管道

    grep -oP "myprop.(?==.*<br>.*)" file 
    

    將給予同樣沒有xargs的切

    +0

    太棒了! ..多謝... –

    +0

    'grep'解決方案很有幫助,但你應該提到它需要_GNU_' grep'。雖然''*''解釋原則上是正確的,但OP更直接的問題是在_backticks_中封入'*
    *'。 另外,儘管'>。*'而不是'> *'確實有效,但值得指出的是隻要'>'會執行,因爲該行的其餘部分不需要匹配。 – mklement0

    1

    你的雙引號字符串包含反引號大約*<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 
    
    +0

    我只是喜歡你的答案......並感謝你付出的精力。帽子掉了! –

    +0

    @NoviceUser:我很欣賞那些不錯的反饋;我很高興你找到了有用的答案。 – mklement0

    相關問題