2012-12-27 57 views
4

在bash正則表達式中逃脫美元符號的正確方法是什麼?我試圖測試一個字符串是否以美元符號開頭。這裏是我的代碼,我在其中雙我的雙引號表達式中逃離美元:Bash - 在正則表達式中逃離美元的正確方法

echo -e "AB1\nAB2\n\$EXTERNAL_REF\nAB3" | while read value; 
do 
    if [[ ! $value =~ "^\\$" ]]; 
    then 
      echo $value 
    else 
      echo "Variable found: $value" 
    fi 
done 

這做什麼,我想爲它有一個框:

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 

而詳細的輸出顯示

+ [[ ! $EXTERNAL_REF =~ ^\$ ]] 
+ echo 'Variable found: $EXTERNAL_REF' 

然而,在另一臺電腦,它使用

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 

的比較如下

+ [[ ! $EXTERNAL_REF =~ \^\\\$ ]] 
+ echo '$EXTERNAL_REF' 

是否有一個標準的/更好的辦法做到這一點,將在所有實施工作擴大呢?

非常感謝

回答

2

爲什麼你在這裏使用正則表達式嗎?一個glob就足夠了:

#!/bin/bash 

while read value; do 
    if [[ "$value" != \$* ]]; then 
     echo "$value" 
    else 
     echo "Variable found: $value" 
    fi 
done < <(printf "%s\n" "AB1" "AB2" '$EXTERNAL_REF' "AB3") 

在這裏可以與shopt -s compat32一起使用。

+0

完美,這是一個很好的解決方法,並且可以在兩種實現方式下實現。謝謝 – user1198484

1

我將取代單引號雙引號和刪除單個\和有變化如下

$value =~ "^\\$" 

也可以用來作爲

$value =~ '^\$' 
+0

如上所述,這似乎不適用於我在4.1.2。如果有人知道我爲什麼會很感興趣知道 – user1198484

0

我從來沒有發現的解決辦法,但對於我而言,我看中了以下解決方法:

if [[ "$value" =~ ^(.)[[:alpha:]_][[:alnum:]_]+\\b && ${BASH_REMATCH[1]} == '$' ]]; then 
    echo "Variable found: $value" 
else 
    echo "$value" 
fi 

而不是試圖「引用」美元符號,我不是匹配它周圍和我的一切捕捉美元符號應該進行直接字符串比較的字符。有點混亂,但它起作用。

另外,我已經開始使用變量,但僅用於反斜槓字符(我不喜歡將整個正則表達式存儲在一個變量中,因爲我覺得它使得正則表達式不會出現在使用它的上下文中):

bs="\\" 
string="test\$test" 
if [[ "$string" =~ $bs$ ]]; then 
    echo "output \"$BASH_REMATCH\"" 
fi 
0

正則表達式根本不需要任何引號。這應該工作:

if [[ ! $value =~ ^\$ ]];