Ваша система должна иметь GNU grep, который имеет опцию -P
для использования выражений Perl и можно использовать это, объединенное с -c
(так никакая потребность в wc -l
):
grep -Pvc '\S' somefile
'\S'
вручает шаблон \S
к grep и соответствиям вся строка, содержащая что-либо, что не является пространством, -v
выбирает все другие строки (те, которые только имеют пространство), и -c
считает их.
Из страницы справочника для grep:
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v
is specified by POSIX.)
-c, --count
Suppress normal output; instead print a count of matching lines
for each input file. With the -v, --invert-match option (see
below), count non-matching lines. (-c is specified by POSIX.)
Эта команда sed запускает регекс, который должен быть полезен для вашей задачи:
sed 's#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1...\2#g'
Test:
PS1PWD_REGEX='s#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1...\2#g'
$ echo "~/apps/webs/2014/" | sed $PS1PWD_REGEX
~/apps/webs/2014/
$ echo "~/apps/webs/chip/mips/2014/" | sed $PS1PWD_REGEX
~/apps/webs/.../mips/2014
$ echo "~/apps/webs/chip/mips/2014" | sed $PS1PWD_REGEX
~/apps/webs/.../mips/2014
$ echo "/apps/webs/chip/mips/clips/2014" | sed $PS1PWD_REGEX
/apps/webs/.../clips/2014
$ echo "/" | sed $PS1PWD_REGEX
/
$ echo "~" | sed $PS1PWD_REGEX
~
Затем вы можете настроить свой профиль в строках:
export PS1='[\u@\h `pwd | sed "s#\(/[^/]\+/[^/]\+/\).*\(/[^/]\+/[^/]\+\)/\?#\1...\2#g"`]\$ '
Я сам предпочитаю многострочную подсказку, которая дает много места для длинных путей в первой строке.
Вы должны просто разделить его и выбрать нужные вам части:
( IFS=/ ; set -- $string
while ${1+:} false ; do
echo "$1" ; shift
done
)
Чтобы получить только начало/завершение:
start_end="$(IFS=/ ; set -- $string ; unset IFS
printf '/%s/.../%s' "$1" \
"`shift $(($#-1)) ; echo "$1"`"
)"