对于GNU Screen标题,我想获得当前目录名称的前缀,其名称前缀为其父目录。例如,在目录
中/home/rhys/share/pkgconfig
/home/rhys
/home
/
产生输出
share/pkgconfig
home/rhys
home
/
在Bash中,从猜测开始
echo $(basename $(dirname $PWD))/$(basename $PWD)
可以找到更好的解决方案
echo $(basename "${PWD%/*}")/${PWD##*/}
我说得更好,因为产生的进程少了两个。
任何人都有一个可爱的伎俩,以避免使用basename
?这是针对每个shell提示符运行的内容,因此尽可能轻量级是很好的。
答案 0 :(得分:0)
如何使用bash和awk:
awk -F'/' '{print $(NF-1)"/"$NF}' <<<"$PWD"
前一个不太正确,因为它会打印/home
而不仅仅是home
。也许你可以忍受。如果没有,这个完全有效:
awk -F'/' '{if (NF==2 && $2) {$0=$2} else {$0=$(NF-1)"/"$NF}}1' <<<"$PWD"
测试出来:
awk -F'/' '{if (NF==2 && $2) {$0=$2} else {$0=$(NF-1)"/"$NF}}1' <<EOF
/home/rhys/share/pkgconfig
/home/rhys
/home
/
EOF
输出:
share/pkgconfig
home/rhys
home
/
答案 1 :(得分:0)
这是一个可以在bash
4或更高版本中使用的功能:
trim () (
IFS=/
read -a c <<< "$1"
unset c[0]
fragment="${c[*]: -2:2}"
echo "${fragment:-/}"
)
for p in /home/rhys/share/pkgconfig /home/rhys /home /; do
trim "$p"
done
share/pkgconfig
home/rhys
home
/
答案 2 :(得分:0)
for p in /home/rhys/share/pkgconfig /home/rhys /home /; do
[[ $p =~ .*/([^/]+/[^/]+)$ ]] && echo "${BASH_REMATCH[1]}" || echo "$p"
done
作为一项功能:
last2() { [[ $1 =~ .*/([^/]+/[^/]+)$ ]] && echo "${BASH_REMATCH[1]}" || echo "$1"; }
应该在bash
&gt; = 3.2