Как я могу выбрать начало … конечная часть '/' разграниченная строка (подсказка PS1 в моем случае)

Ваша система должна иметь 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.)
2
12.04.2014, 20:28
2 ответа

Эта команда 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"`]\$ '

Я сам предпочитаю многострочную подсказку, которая дает много места для длинных путей в первой строке.

3
27.01.2020, 22:00

Вы должны просто разделить его и выбрать нужные вам части:

( 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"`"
)"
1
27.01.2020, 22:00

Теги

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