Вот путь Perl:
$ perl -lne '/^\*(.*)/ || print "$_$1"' file
strawberry
raspberry
blueberry
boysenberry
blahblah
blahblah
blahblah
strawberry
blueberry
blah
vegetable
pingpongtable
-n заставит Perl читать каждую строку входного файла, сохраняя его в специальной переменной $_, -l приведет к тому, что i) отделит последние строки (\n) от каждой строки и ii) добавит новую строку для каждого вызова print. [F8] - это скрипт, который применяется к каждой строке.
/^\*(.*)/: строки соответствия, начинающиеся со звездочки и сохраняющие все после звездочки как $1 (вот что делают круглые скобки). || print "$_$1"': || является логическим OR. Поэтому print будет выполняться только в том случае, если текущая строка не начиналась со звездочки. Если это так, мы печатаем текущую строку ($_) вместе с тем, что в настоящее время сохраняется как $1 (шаблон, следующий за звездочкой).Как обычно, есть много способов сделать это. Глупый и неэффективный, но тот, который выделяет возможности манипуляции с строкой оболочки, это:
$ while read line; do
[[ $line =~ ^\* ]] && pat="${line#\*}" || printf "%s%s\n" "$line" "$pat";
done < file
strawberry
raspberry
blueberry
boysenberry
blahblah
blahblah
blahblah
strawberry
blueberry
blah
vegetable
pingpongtable