我从用户那里收到一个特定的绝对文件路径,我想创建一个变量,该变量将是一个字符串,它不仅包含第一的文件路径的两个组成部分,但不打印它或任何内容。
例如,绝对路径可以是:
/home/myusername/folder1/folder2/folder3
它保存在“target_path”中,我希望“mydir”仅为:
/folder1/folder2/folder3
我尝试以不同的方式使用 cut 命令,但没有成功。
答案1
使用bash 的字符串操作:
$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3
因此,您想要的字符串将是(添加回前导斜杠):
b="/${a#/*/*/}"
对于变量a
,将从中${a#foo}
删除最短的字符串匹配foo
开始的。因此,我们删除包含三个(包括路径中的前斜杠)a
的最短字符串,以删除绝对路径的前两个组件。/
答案2
下面是使用的示例cut
echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4-
folder1/folder2/folder3
如果需要前导,/
可以将其附加| sed 's/^/\//'
到行尾。
您需要,-f4-
因为-d '/'
告诉cut
将其用作/
字段之间的分隔符。因此,第一个字段位于第一个分隔符之前,在本例中,第一个字段为空。folder1
第 4 个字段也是如此,并-f4-
告诉 cut 使用从第 4 个开始的所有字段。
答案3
你可以像这样使用 bash 参数扩展:
target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"
在这之后:
echo $myvar
给出:
/folder1/folder2/folder3
/*/*/
它的工作原理是使用 shell 参数扩展语法从 target_path 变量中删除模式的第一个匹配项${target_path#pattern}
。不幸的是,这会删除第一个/
字符,这就是为什么在设置 myvar 变量时必须明确包含该字符的原因。
警告:在使用此方法之前,您应该检查 target_path 变量是否包含一些字符,并且长度超过两个路径段。例如,如果target_path=/home/username/
,则myvar=/
。如果您运行类似 的程序,这可能会对您的系统造成危险rm -rf "$myvar"*
。不要尝试这个!