删除Unix上的部分路径

esa*_*lva 57 unix shell scripting sed

我正在尝试删除字符串中的部分路径.我有路径:

/path/to/file/drive/file/path/
Run Code Online (Sandbox Code Playgroud)

我想删除第一部分/path/to/file/drive并生成输出:

file/path/
Run Code Online (Sandbox Code Playgroud)

注意:我在while循环中有几个路径,/path/to/file/drive所有路径都相同,但我只是在寻找删除所需字符串的"方法".

我找到了一些例子,但我无法让它们起作用:

echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive:\2:'
echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive:2'
Run Code Online (Sandbox Code Playgroud)

\2 作为字符串的第二部分,我显然做错了...也许有一种更简单的方法?

ACK*_*low 71

如果你想删除路径组件一定数量的,你应该使用cut-d'/'.例如,如果path=/home/dude/some/deepish/dir:

要删除前两个组件:

# (Add 2 to the number of components to remove to get the value to pass to -f)
$ echo $path | cut -d'/' -f4-
some/deepish/dir
Run Code Online (Sandbox Code Playgroud)

保留前两个组件:

$ echo $path | cut -d'/' -f-3
/home/dude
Run Code Online (Sandbox Code Playgroud)

要删除最后两个组件(rev反转字符串):

$ echo $path | rev | cut -d'/' -f4- | rev
/home/dude/some
Run Code Online (Sandbox Code Playgroud)

要保留最后三个组件:

$ echo $path | rev | cut -d'/' -f-3 | rev
some/deepish/dir
Run Code Online (Sandbox Code Playgroud)

或者,如果要删除特定组件之前的所有内容,则sed可以正常工作:

$ echo $path | sed 's/.*\(some\)/\1/g'
some/deepish/dir
Run Code Online (Sandbox Code Playgroud)

或者在特定组件之后:

$ echo $path | sed 's/\(dude\).*/\1/g'
/home/dude
Run Code Online (Sandbox Code Playgroud)

如果您不想保留您指定的组件,则会更容易:

$ echo $path | sed 's/some.*//g'
/home/dude/
Run Code Online (Sandbox Code Playgroud)

如果你想保持一致,你也可以匹配尾随斜杠:

$ echo $path | sed 's/\/some.*//g'
/home/dude
Run Code Online (Sandbox Code Playgroud)

当然,如果你匹配几个斜杠,你应该切换sed分隔符:

$ echo $path | sed 's!/some.*!!g'
/home/dude
Run Code Online (Sandbox Code Playgroud)

请注意,这些示例都使用绝对路径,您必须使用它们来使它们与相对路径一起使用.


evi*_*tto 50

您也可以使用POSIX shell变量扩展来执行此操作.

path=/path/to/file/drive/file/path/
echo ${path#/path/to/file/drive/}
Run Code Online (Sandbox Code Playgroud)

#..当变量扩展时,该部分剥离一个前导匹配字符串; 如果您的字符串已经在shell变量中,那么这非常有用,例如,如果您正在使用for循环.您也可以使用,从变量的末尾剥离匹配的字符串(例如,扩展名)%....有关bash血淋淋的详细信息,请参见手册页.


gle*_*man 26

如果您不想对要删除的部分进行硬编码:

$ s='/path/to/file/drive/file/path/'
$ echo ${s#$(dirname "$(dirname "$s")")/}
file/path/
Run Code Online (Sandbox Code Playgroud)

  • 我花了2个小时来寻找方法。并且您是唯一发布一种无需硬编码即可显示目录名称的方法的人。我需要做:'查找/ path / to / file / drive / file / * _ TST -maxdepth 0 -type d'但是我只想显示不带完整路径的目录名称。做到了。 (2认同)

Jon*_*len 10

使用sed执行此操作的一种方法是

echo /path/to/file/drive/file/path/ | sed 's:^/path/to/file/drive/::'
Run Code Online (Sandbox Code Playgroud)

  • 您几乎可以在 sed 中使用任何分隔符,而不仅仅是 / 和 : 只要您保持一致。 (2认同)

Fri*_*itz 5

如果你想删除路径的前 N ​​个部分,你当然可以使用N 个调用dirname,如glenn's answer,但使用 globbing 可能更容易:

path=/path/to/file/drive/file/path/
echo "${path#*/*/*/*/*/}"   #  file/path/
Run Code Online (Sandbox Code Playgroud)

具体来说,${path#*/*/*/*/*/}意味着“返回$path减去包含 5 个斜线的最短前缀”