Bash - 在正则表达式中逃避美元的正确方法

时间:2012-12-27 09:56:03

标签: regex bash substitution expansion

在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'

是否有标准/更好的方法可以在所有实施中使用?

非常感谢

4 个答案:

答案 0 :(得分: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一起使用。

答案 1 :(得分:1)

我会用单引号替换双引号并删除单个\并进行如下更改

$value =~ "^\\$"

也可以用作

$value =~ '^\$'

答案 2 :(得分:1)

正则表达式根本不需要任何引号。这应该有效:

Nagle's algorithm

答案 3 :(得分:0)

我也从未找到解决方案,但出于我的目的,我决定采用以下解决方法:

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

我不是试图“引用”美元符号,而是匹配它周围的一切,我捕捉到美元符号应该进行直接字符串比较的字符。有点像kludge,但它确实有效。

或者,我已经开始使用变量,但只是用于反斜杠字符(我不喜欢将整个正则表达式存储在一个变量中,因为我觉得让正则表达式没有出现在使用它的上下文中会让人感到困惑) :

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