如何在 bash 中修剪字符串变量

Gre*_*reg 3 linux bash

我有最初包含不同目录路径的字符串,其中第二个和最后第二个子目录的长度可以不同,如下所示

 /home/Leo/Work/CMI/ARCH/MWS/Disks
 /home/Cleo/Work/CMI/ARCH/BK/Disks
Run Code Online (Sandbox Code Playgroud)

我想修剪前 5 个子目录,只显示最后 2 个,就像这样

 echo "/MWS/Disks"
 echo "/BK/Disks"
Run Code Online (Sandbox Code Playgroud)

从初始字符串中修剪前 5 个子目录的一种方法可能是将每个字符左移,直到两个字符串都以倒数第二个“/”开头。

Bash初学者指南描述了一种shift built-in左移命令中的位置参数并丢弃未使用的参数的方法。但是否可以使用此方法从上述字符串中删除前 5 个子目录还不是很明显。

在 Bash 中,如何减少这些字符串,最好不使用循环?


澄清

从评论来看,需要更多的背景信息。我的 Bash 脚本从 8 英寸软盘映像中恢复历史 Mdos 和 Qdos 文件,并将文件保存到硬盘驱动器上的目录中。

无论好坏,我创建了一个定制方案,使用 3 字符变量名称存储目录路径,其中每个名称都是当前目录路径部分的首字母缩写词。

例如以下路径中MWC的缩写$MY/Work/CMI

MY="$USER"
MWC="C:/cygwin64/home/$MY/Work/CMI"
cd "$MWC"
pwd
C:/cygwin64/home/$MY/Work/CMI
Run Code Online (Sandbox Code Playgroud)

同样,3 字符变量指向树上的下一个子目录

WCA="$MWC/ARCH"
Run Code Online (Sandbox Code Playgroud)

C:/cygwin64/home/$MY/Work/CMI/ARCH,档案所有者画廊的路径。

由于目录路径加长了 3 个字符的变量,因此可以通过保留列表中的空白来轻松识别路径。尽管如此,每当我的脚本引用路径时,就会出现完整路径。因此需要修剪最终用户不感兴趣的字符串部分。

cho*_*oba 8

如果子目录的数量始终相同,则可以使用参数扩展来删除前 5 个子目录:

s=/home/Leo/Work/CMI/ARCH/MWS/Disks
s=/${s#/*/*/*/*/*/}
echo $s  # /MWS/Disks
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道无论路径的深度如何,您都需要最后两部分:

s=/home/Leo/Work/CMI/ARCH/MWS/Disks
last=/${s##*/}
last_but1=${s%$last}
last_but1=/${last_but1##*/}
echo $last_but1$last  # /MWS/Disks
Run Code Online (Sandbox Code Playgroud)
  • ${s#PATTERN}从 的开头删除 PATTERN $s
  • ${s%PATTERN}从 的末尾删除 PATTERN $s
  • 使用#%,找到 PATTERN 的最短匹配。将它们加倍可以使比赛时间尽可能长。