Уменьшение моего ubuntu, когда установленный диск скрыт

Вот путь 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

Пояснение

/^\*(.*)/: строки соответствия, начинающиеся с звездочку и сохранить все после звездочки как $1 (вот что в скобках). [[ $line =~ ^\* ]] && pat="${line#\*}": если строка начинается с *, после этого удалите все (это то, что делает ${line#\*}, более подробно см. здесь) и сохраните его как $pat. * || printf "%s%s\n" "$line" "$pat";: если предыдущая команда не удалась (поэтому строка не начинается со звездочки), напечатайте строку и текущее значение $pat.
0
задан 18 February 2018 в 10:10

0 ответов

Другие вопросы по тегам:

Похожие вопросы: