我真的不知道我在做什么。 在变量a中,我想在“ Bitcoin”的首次出现之后找到“ $”的首次出现,并打印其后的所有内容,直到出现第一行。 我有以下代码:
a = 'something Bitcoin something againe $jjjkjk\n againe something'
if [[ $a =~ .*Bitcoin.*[\$](.*).* ]]; then
echo "${BASH_REMATCH[1]}"
else
echo "no"
fi
在此示例中,我想获取“ jjjkjk”。我得到的只是“不”。 这段代码可能真的有缺陷,我对此没有经验。我认为问题可能出在“ $”符号上。请帮忙!
答案 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)代替美元符号