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)
Jon*_*len 10
使用sed执行此操作的一种方法是
echo /path/to/file/drive/file/path/ | sed 's:^/path/to/file/drive/::'
Run Code Online (Sandbox Code Playgroud)
如果你想删除路径的前 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 个斜线的最短前缀”。