如何缩短 bash 中 // 之间的路径部分
How to shorten path parts between // in bash
我希望缩短 bash 提示路径:
~/workspace/project/my-project
# Should be
~/w/p/my-project
这可以通过将 // 之间的部分路径字符串缩短为第一个字符来实现。
有没有办法在 sed 中做到这一点?
编辑:
认为其他人对此进行调查可能会发现我结束的有用,所以我在这里编辑它。
.bashrc:
dir_chomp () {
pwd | sed "s|^$HOME|~|" 2> /dev/null | sed 's:\(\.\?[^/]\)[^/]*/:/:g'
}
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ ()/'
}
export PS1="\[3[32m\]$(dir_chomp)\[3[33m\]$(parse_git_branch)\[3[00m\] $ "
提示示例(未显示颜色):
~/w/e/coolstuff (master) $
~/.c/A/Cache $
如果你想无条件地缩短所有路径组件,你可以很容易地做到 sed
:
sed 's:\([^/]\)[^/]*/:/:g'
如果你还想在以 $HOME
开头的路径开头插入 ~
,你可以将其添加到 sed 命令中(尽管这个天真的版本假设 $HOME
不包括冒号)。
sed 's:^'"$HOME"':~:/;s:\([^/]\)[^/]*/:/:g'
更好的解决方案是使用 bash 替换:
short_pwd() {
local pwd=$(pwd)
pwd=${pwd/#$HOME/\~}
sed 's:\([^/]\)[^/]*/:/:g' <<<"$pwd"
}
使用 bash 函数,您可以从 PS1 字符串中 "call" 它:
$ PS1='$(short_pwd)$ '
~/s/tmp$ PS1='$ '
$
每次显示时使用PROMPT_COMMAND
动态设置您的提示。
shorten_path () {
cwd=${PWD/workspace/w}
cwd=${cwd/project/p}
cwd=${cwd/$HOME/~}
PS1="$cwd "'$ '
}
PROMPT_COMMAND=shorten_path
这将使用自定义代码替换 \w
转义以缩短当前工作目录。不幸的是,将 ~
替换为您的主目录的名称会带来不幸的副作用,这就是为什么需要第三行才能将其放回原位的原因。
我用它来缩短到 3 个字符加上“..”:
shortpath()
{
dir=${1%/*} && last=${1##*/}
res=$(for i in ${dir//\// } ; do echo -n "${i:0:3}../" ; done)
echo "/$res$last"
}
要缩短到一个字符的版本:
shortpath()
{
dir=${1%/*} && last=${1##*/}
res=$(for i in ${dir//\// } ; do echo -n "${i:0:1}/" ; done)
echo "/$res$last"
}
然后:
export PS1="$(shortpath $(pwd)) $"
我希望缩短 bash 提示路径:
~/workspace/project/my-project
# Should be
~/w/p/my-project
这可以通过将 // 之间的部分路径字符串缩短为第一个字符来实现。
有没有办法在 sed 中做到这一点?
编辑:
认为其他人对此进行调查可能会发现我结束的有用,所以我在这里编辑它。
.bashrc:
dir_chomp () {
pwd | sed "s|^$HOME|~|" 2> /dev/null | sed 's:\(\.\?[^/]\)[^/]*/:/:g'
}
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ ()/'
}
export PS1="\[3[32m\]$(dir_chomp)\[3[33m\]$(parse_git_branch)\[3[00m\] $ "
提示示例(未显示颜色):
~/w/e/coolstuff (master) $
~/.c/A/Cache $
如果你想无条件地缩短所有路径组件,你可以很容易地做到 sed
:
sed 's:\([^/]\)[^/]*/:/:g'
如果你还想在以 $HOME
开头的路径开头插入 ~
,你可以将其添加到 sed 命令中(尽管这个天真的版本假设 $HOME
不包括冒号)。
sed 's:^'"$HOME"':~:/;s:\([^/]\)[^/]*/:/:g'
更好的解决方案是使用 bash 替换:
short_pwd() {
local pwd=$(pwd)
pwd=${pwd/#$HOME/\~}
sed 's:\([^/]\)[^/]*/:/:g' <<<"$pwd"
}
使用 bash 函数,您可以从 PS1 字符串中 "call" 它:
$ PS1='$(short_pwd)$ '
~/s/tmp$ PS1='$ '
$
每次显示时使用PROMPT_COMMAND
动态设置您的提示。
shorten_path () {
cwd=${PWD/workspace/w}
cwd=${cwd/project/p}
cwd=${cwd/$HOME/~}
PS1="$cwd "'$ '
}
PROMPT_COMMAND=shorten_path
这将使用自定义代码替换 \w
转义以缩短当前工作目录。不幸的是,将 ~
替换为您的主目录的名称会带来不幸的副作用,这就是为什么需要第三行才能将其放回原位的原因。
我用它来缩短到 3 个字符加上“..”:
shortpath()
{
dir=${1%/*} && last=${1##*/}
res=$(for i in ${dir//\// } ; do echo -n "${i:0:3}../" ; done)
echo "/$res$last"
}
要缩短到一个字符的版本:
shortpath()
{
dir=${1%/*} && last=${1##*/}
res=$(for i in ${dir//\// } ; do echo -n "${i:0:1}/" ; done)
echo "/$res$last"
}
然后:
export PS1="$(shortpath $(pwd)) $"