2014-10-01 31 views
2

如何驗證.bashrc中是否存在以下代碼塊並且-if不附加它?Vagrant-Ansible/Bash:驗證文件中是否存在多引用代碼塊

function parse_git_branch { 
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/[\1$(parse_git_dirty)]/" 
} 
+0

使用AWK會很容易。 – 5gon12eder 2014-10-01 22:14:36

+0

@ 5gon12eder謝謝你的提示,我一定會想要發現awk的簡單性。目前,我很難想象它。 – raratiru 2014-10-01 23:05:44

+0

我現在對此有點內疚。我會給你的代碼,但我擔心你不會喜歡它。對不起。 – 5gon12eder 2014-10-01 23:08:03

回答

1

這是AWK解決方案,但我必須承認這不是「非常容易」。基本上,我們正在構建一個識別三條線的有限自動機。退出狀態爲0當且僅當找到該模式。

BEGIN { 
    state = 0; 
} 

/.*/ { 
    if ($0 == "function parse_git_branch {") { 
     state = 1; 
    } else if ($0 == " git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e \"s/* \\(.*\\)/[\\1$(parse_git_dirty)]/\"") { 
     if (state == 1) { 
      state = 2; 
     } else { 
      state = 0; 
     } 
    } else if ($0 == "}") { 
     if (state == 2) { 
      state = 3; 
      exit 0; 
     } else { 
      state = 0; 
     } 
    } else { 
     state = 0; 
    } 
} 

END { 
    # The END rule is always entered, even if we exit via 'exit' so we need to 
    # check the state again. 
    if (state < 3) { 
     exit 1; 
    } 
} 

我看到的最大的問題是,這會回答「不」,即使該函數存在,但格式稍有不同(但是從語法上等同)。你可以嘗試通過使用更寬容的正則表達式模式而不是字符串比較來改善這一點。

我覺得必須有比這更好的解決方案。也許使用差異?

免責聲明:這是公平的倒票這個答案。我只是想向OP展示我是(錯誤的)想法是一個簡單的解決方案。如果有更好的答案,我會刪除我的,因爲我自己不喜歡它。

+0

非常感謝你的努力。這對我的情況來說很尷尬,但這一定是'藝術'出現的時候,一切似乎都是公然的! – raratiru 2014-10-01 23:15:23

+0

@rara_tiru另外,它確實有一個錯誤的bug。我已經更新了我的答案以解決問題。 – 5gon12eder 2014-10-01 23:17:59

相關問題