[英]Bash - correct way to escape dollar in regex
在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'
是否有一种标准/更好的方法可以在所有实现中使用?
非常感谢
为什么在这里使用正则表达式? 一个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
。
我会用单引号替换双引号并删除一个\\
并进行如下更改
$value =~ "^\\$"
也可以用作
$value =~ '^\$'
正则表达式根本不需要任何引号。 这应该工作:
if [[ ! $value =~ ^\$ ]];
我也从未找到解决方案,但出于我的目的,我决定采用以下解决方法:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.