Почему ваш ожидаемый результат задан b5f1e7$bfc2439c621353$d1ce0$629f$b8b5
двумя элементами bfc2439c621353 629f
, а не тремя элементами bfc2439c621353 d1ce0 629f
?
Вот одна команда grep для ее извлечения:
$ grep -Po '\$\K[^\$]*(?=\$)' <<<'b5f1e7$bfc2439c621353$d1ce0$629f$b8b5'
bfc2439c621353
d1ce0
629f
(Для этого требуется GNU grep, скомпилированный с libpcre для -P
)
При этом используется \$\K
(эквивалент (?<=\$)
для просмотра первых $
и (?=\$)
для просмотра впередследующий $
. Так как это обходные пути, они не поглощаются grep в процессе, и поэтому можно найти d1ce0
.
Вот одна команда POSIX sed для их извлечения:
$ sed 's/^[^$]*\$//; s/\$[^$]*$//; s/\$/\n/g' \
<<<'b5f1e7$bfc2439c621353$d1ce0$629f$b8b5'
bfc2439c621353
d1ce0
629f
Это не использует нотацию GNU и должно работать в любой POSIX-совместимой системе (например, OS X). Он удаляет начальные и конечные части, которые не нужны, а затем заменяет каждый $
на новую строку.