sed -e'1{x;s/^/0ddsQsEsD[q]sq/p;x;}' \
-e'/[^?!.]*\([?!.]\)[^?!.]*/!d;=' \
-e's// l\11+s\1 /g;s/.*/pc0dds?s!s.&Q?E!D./' \
-e's/\([QED]\)\(.\)/[l\21>q9P[\2=]Pl\2pl\1+9P[Total: ]Pps\1]x/g' |dc
Для любой строки, содержащей любое из [?!.]
, эта команда сначала напечатает свой номер строки, а затем количество символы в этой строке, а затем текущий счет для каждого.
printf %s\\n \? \?\!. '' hey \? '' '' \! ...hey... .\!\? |
sed -e'1{x;s/^/0ddsQsEsD[q]sq/p;x;}' \
-e'/[^?!.]*\([?!.]\)[^?!.]*/!d;=' \
-e's// l\11+s\1 /g;s/.*/pc0dds?s!s.&Q?E!D./' \
-e's/\([QED]\)\(.\)/[l\21>q9P[\2=]Pl\2pl\1+9P[Total: ]Pps\1]x/g' |dc
1
?=1
Total: 1
2
?=1
Total: 2
!=1
Total: 1
.=1
Total: 1
5
?=1
Total: 3
8
!=1
Total: 2
9
.=6
Total: 7
10
?=1
Total: 4
!=1
Total: 3
.=1
Total: 8
Пытаясь найти способ получить красивое приглашение в POSIX sh, я столкнулся с двумя ограничениями реализации sh в PS1, которые мне пришлось обойти:
Хотя \w
в переменной PS1
работает, она не расширяет $HOME
до ~
Хотя вы можете использовать PS1
для обновления подсказки на терминале, кажется невозможным обновить заголовок xterm с помощью переменной PS1
. Символы ESC
и BEL
не могут установить заголовок, как можно было бы ожидать, если бы они использовали bash или ksh
Вот окончательный результат, работает очень хорошо. Его необходимо добавить в ваш файл.shrc (. Сначала убедитесь, что PS1 еще не определен ):
.update_prompt() {
case "$PWD" in
"$HOME"*)
pretty_pwd="~${PWD#*"${HOME}"}"
;;
"/usr$HOME"*)
pretty_pwd="~${PWD#*"/usr${HOME}"}"
;;
*)
pretty_pwd="$PWD"
;;
esac
case "$TERM" in
xterm*|rxvt*)
PS1="($USER@\\h $pretty_pwd)\\$ "
;;
*)
;;
esac
printf "\\033]0;(%s@$(hostname -s): %s)\\007" "$USER" "$pretty_pwd"
}
update_prompt
cd() {
command cd "$@" && update_prompt
}
Обратите внимание, что подсказка будет заключена в круглые скобки. Это просто личное напоминание самому себе, что я на FreeBSD, а не на Ubuntu. Если вы предпочитаете более традиционное приглашение, просто используйте это:
update_prompt() {
case "$PWD" in
"$HOME"*)
pretty_pwd="~${PWD#*"${HOME}"}"
;;
"/usr$HOME"*)
pretty_pwd="~${PWD#*"/usr${HOME}"}"
;;
*)
pretty_pwd="$PWD"
;;
esac
case "$TERM" in
xterm*|rxvt*)
PS1="$USER@\\h $pretty_pwd\\$ "
;;
*)
;;
esac
printf "\\033]0;%s@$(hostname -s): %s\\007" "$USER" "$pretty_pwd"
}
update_prompt
cd() {
command cd "$@" && update_prompt
}
Возможно, вы захотите удалить условие "/usr$HOME"*)
, если вы работаете в Linux. Это бесполезно, если вы не используете FreeBSD, где /home
обычно является символической ссылкой на /usr/home
.