2015-08-15 67 views
2

,嘗試匹配,看起來像{% extends "file.txt" %},使用下面的代碼的任何字符串:bash的擴展正則表達式的if語句

local FILE_REG="(\.{0,2}\/)*([a-zA-Z0-9_]*|\/[a-zA-Z0-9_]*)*[a-zA-Z0-9_]*\.[a-zA-Z0-9_]*" 
local EXTENDS_REG='{%\s*extends\s*".*"\s*%}' 

local extends=0 
local filename="$1" 

echo $EXTENDS_REG; 
while read -r line ; do 
    if [[ "$line" =~ "{%\s*extends\s*\".*\"\s*%}" ]] ; then 
    echo "true: $line"; 
    else 
    echo "false: $line"; 
    fi; 
done < $filename 

的if語句未能在以下的第一行返回true:

{% extends "base.tsh" %} 
{% block my_block %} 
    echo "Hello World from inherit.tsh!" 
{% endblock %} 

我已在regex101.com上驗證了我的正則表達式,並且第2行中的模式與字符串完全匹配,而將".*"替換爲$FILE_REG與先前的字符串匹配,並將「file.txt」替換爲任何有效的/path/to/file_with_extension.txt

我試圖在if語句的EXTENDS_REG的許多變化,其中包括:

  • if [[ "$line" =~ "$EXTENDS_REG" ]](可變)
  • if [[ "$line" =~ $EXTENDS_REG ]](可變,不包括引號)
  • if [[ "$line" =~ '{%\s*extends\s*".*"\s*%}' ]](約正則表達式的單引號)
  • if [[ "$line" =~ '{%\s*extends\s*"'$FILE_REG'"\s*%}' ]](複合+單引號)
  • if [[ "$line" =~ {%\s*extends\s*\".*\"\s*%} ]](無引號)

但沒有人工作。我懷疑如果正則表達式匹配太侷限,無法在bash中正確讀取正則表達式。

任何人有任何解決方案?最好我在尋找一些有效的東西,並且不依賴於外部的二進制文件,除了grep,awk,sed和al。無需python,ruby,perl等;)

感謝您的幫助!

回答

3
line='{% extends "file.txt" %}' 
if [[ $line =~ \{%[[:space:]]*extends[[:space:]]*\".*\"[[:space:]]*%\} ]] 

在bash替換字符類如\s與那些形式[[:class:]]的。

這是definitive list

+0

謝謝,永遠不會發現我自己。也爲源+1。 你知道爲什麼在變量中使用你的版本的正則表達式不起作用嗎?又名'EXTEND_REG = \ {%[[:space:]] * extends [[:space:]] * \「。* \」[[:space:]] *%\}''[[$ line =〜 「$ EXTEND_REG」]]'或'[[$ line =〜$ EXTEND_REG]]'?是否因爲與正則表達式eval衝突? –

+1

嘗試'EXTEND_REG ='\ {%[[:space:]] * extends [[:space:]] * \「。* \」[[:space:]] *%\}''然後'[[ $ line =〜$ EXTEND_REG]]' –

+0

確實有效!謝謝,這將允許我使我的代碼更清潔。 –