'$' в регулярном выражении в bash - PullRequest
0 голосов
/ 19 марта 2019

Я действительно не знаю, что я делаю.В переменной a я хочу найти первое появление «$» после первого появления «Биткойн» и распечатать все после него до первой новой строки.У меня есть следующий код:

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

В этом примере я хотел бы получить 'jjjkjk'.Все, что я получаю, это «нет».Этот код может быть действительно ошибочным, у меня нет опыта в этом.Я думаю, что проблема может быть со знаком «$».Пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Правильно обрабатывать новые строки в bash с помощью ANSI-C Цитирование - \ 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
0 голосов
/ 19 марта 2019

Вот рабочая версия вашего кода:

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 = ".." `.

Использование двойных кавычек также неправильно, это заменит знак доллара пустой переменной ( оценка )

...