bash正则表达式中的“ $”

时间:2019-03-19 18:09:03

标签: regex bash shell

我真的不知道我在做什么。 在变量a中,我想在“ Bitcoin”的首次出现之后找到“ $”的首次出现,并打印其后的所有内容,直到出现第一行。 我有以下代码:

a = 'something Bitcoin something againe $jjjkjk\n againe something'
if [[ $a =~ .*Bitcoin.*[\$](.*).* ]]; then
    echo "${BASH_REMATCH[1]}" 
else
echo "no"
fi

在此示例中,我想获取“ jjjkjk”。我得到的只是“不”。 这段代码可能真的有缺陷,我对此没有经验。我认为问题可能出在“ $”符号上。请帮忙!

2 个答案:

答案 0 :(得分:1)

使用ANSI-C Quoting正确处理bash中的换行符- \ n 序列变为原义换行符。

a=$'something Bitcoin something againe $jjjkjk\n againe something'
regex=$'Bitcoin[^$]*[$]([^\n]+)'
[[ $a =~ $regex ]] && declare -p BASH_REMATCH
declare -ar BASH_REMATCH='([0]="Bitcoin something againe \$jjjkjk" [1]="jjjkjk")'
# .................................................................^^^^^^^^^^^^

要验证内容是否包含换行符:

$ printf '%s' "$regex" | od -c
0000000   B   i   t   c   o   i   n   [   ^   $   ]   *   [   $   ]   (
0000020   [   ^  \n   ]   +   )
0000026

答案 1 :(得分:-1)

这是您代码的有效版本:

a='something Bitcoin something againe $jjjkjk\n againe something'
r=".*Bitcoin.*[\$]([^\n]*).*"
if [[ $a =~ $r ]]; then
    echo "${BASH_REMATCH[1]}" 
else
echo "no"
fi

无论两者之间是什么,都需要先找到“ Bitcoin”,然后再找到“ $”,因此,您应该使用.*运算符,并且当您要捕获某些文本直到特定的字符时,最好的方法是使用[^](非)运算符,在您的情况下:[^\n]这意味着捕获所有内容,直到\n

您的变量声明也有问题。 a = "..."无效,空格已浪费。所以正确的是'a =“ ..”`。

使用双引号也是错误的,这将用一个空变量(evaluation)代替美元符号