Какие-нибудь идеи, кроме включения цикла for?
В оболочках вы не можете избежать цикла, потому что традиционно они не поддерживают регулярное выражение, а вместо этого сопоставляют глобусы. И паттерны глобуса не поддерживают какие-либо счетчики повторений.
И, кстати, самый простой способ сделать это в оболочке: echo $(cd $PWD/../.. && echo $PWD)
, где /../..
заставляет его раздеть два уровня.
С крошечным Perl это будет:
perl -e '$ENV{PWD} =~ m@^(.*)(/[^/]+){2}$@ && print $1,"\n"'
{2}
в регулярном выражении Perl - это количество записей каталога для удаления. Или сделать его настраиваемым:
N=2
perl -e '$ENV{PWD} =~ m@^(.*)(/[^/]+){'$N'}$@ && print $1,"\n"'
Можно также использовать Perl split () , join () и splice () для этой цели, например ::
perl -e '@a=split("/", $ENV{PWD}); print join("/", splice(@a, 0, -2)),"\n"'
где -2
говорит, что из пути должны быть удалены последние две записи.