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等;)
感謝您的幫助!
謝謝,永遠不會發現我自己。也爲源+1。 你知道爲什麼在變量中使用你的版本的正則表達式不起作用嗎?又名'EXTEND_REG = \ {%[[:space:]] * extends [[:space:]] * \「。* \」[[:space:]] *%\}''[[$ line =〜 「$ EXTEND_REG」]]'或'[[$ line =〜$ EXTEND_REG]]'?是否因爲與正則表達式eval衝突? –
嘗試'EXTEND_REG ='\ {%[[:space:]] * extends [[:space:]] * \「。* \」[[:space:]] *%\}''然後'[[ $ line =〜$ EXTEND_REG]]' –
確實有效!謝謝,這將允許我使我的代碼更清潔。 –