bash中regexp中的“$”

bash中regexp中的“$”,regex,bash,shell,Regex,Bash,Shell,我真的不知道我在做什么。 在变量a中,我希望在“比特币”的第一个外观之后找到“$”的第一个外观,并打印它之后的所有内容,直到第一个换行符。 我有以下代码: a = 'something Bitcoin something againe $jjjkjk\n againe something' if [[ $a =~ .*Bitcoin.*[\$](.*).* ]]; then echo "${BASH_REMATCH[1]}" else echo "no" fi 在这个例子中,我想得到

我真的不知道我在做什么。 在变量a中,我希望在“比特币”的第一个外观之后找到“$”的第一个外观,并打印它之后的所有内容,直到第一个换行符。 我有以下代码:

a = 'something Bitcoin something againe $jjjkjk\n againe something'
if [[ $a =~ .*Bitcoin.*[\$](.*).* ]]; then
    echo "${BASH_REMATCH[1]}" 
else
echo "no"
fi
在这个例子中,我想得到'jjjk'。我得到的只是“不”。
这段代码可能真的有缺陷,我在这方面没有经验。我想问题可能出在“$”符号上。请帮忙

以下是您的代码的工作版本:

a='something Bitcoin something againe $jjjkjk\n againe something'
r=".*Bitcoin.*[\$]([^\n]*).*"
if [[ $a =~ $r ]]; then
    echo "${BASH_REMATCH[1]}" 
else
echo "no"
fi
您需要找到“比特币”,然后在其后面找到一个“$”,无论两者之间是什么,因此您应该使用。*运算符,而且当您希望捕获某些文本直到特定字符时,最好的方法是使用[^]not运算符,在您的情况下:[^\n]这意味着捕获所有内容直到\n

您的变量声明也有问题。a=。。。无效,空间是浪费的。所以正确的答案是“a=…”


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

正确处理bash中的换行符,使-\n序列成为文字换行符

a=$'something Bitcoin something againe $jjjkjk\n againe something'
regex=$'Bitcoin[^$]*[$]([^\n]+)'
[[ $a =~ $regex ]] && declare -p BASH_REMATCH
要验证内容是否包含换行符,请执行以下操作:

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

尝试请注意,您的a没有正确声明,并且在插值时它里面没有$。另外,您试图将PCRE正则表达式与Bash一起使用,这是不对的。这里匹配任何字符,包括换行符。[\s\s]匹配\、s或s.Ty,这非常有帮助。我编辑了代码,仍然不是很好。我编辑得对吗?不,不对,您的字符串没有换行符。[^\n]匹配任何字符,但\n和n。它不匹配任何字符,只匹配换行符。此外,a='something Bitcoin something againe$JJJJKJK\n againe something'也没有新行。如果a是'something Bitcoin something$stuff OP想要捕获$other stuff\n等,那么在使用。*后匹配只会匹配其他东西,因为。*是贪婪的,会尽可能多地消费。因此,也许可以使用[^\$]*而不是。*.@WiktorStribiżew我添加了反斜杠以转义$,因为他在双引号字符串中定义正则表达式。我并不是说这一改变本身就能修复正则表达式。只是它可以防止贪婪地跳过输入中的多个$字符。是的,但它仍然无法修复这种方法。[^\n]这意味着捕获所有内容,直到\n是一个错误。@WiktorStribiżew如果通过这种方法,你指的是Saeed的解决方案,那么我没有说它会解决整个解决方案。我的评论只涉及不使用。*,因为它可能会跳过多个$字符。如果您指的是我的修正,那么是的,我认为我的方法需要额外的反斜杠来区分字符“$”和表示行尾的regex元字符$。但是除了缺少额外的反斜杠之外,是的,它确实解决了。*过于贪婪的问题。
$ printf '%s' "$regex" | od -c
0000000   B   i   t   c   o   i   n   [   ^   $   ]   *   [   $   ]   (
0000020   [   ^  \n   ]   +   )
0000026