删除字符串后的所有内容,但不包括该字符串

时间:2014-01-17 18:27:41

标签: bash sed awk

我正在使用vmrun list来获取我机器上所有正在运行的vms,但我只想要目录名称。目前输出是

/path/to/vm.vmwarevm/vm.vmx

我想要

/path/to/vm.vmwarevm

我知道我可以使用

vmrun list|sed s/vmwarevm.*//

但是这也删除了vmwarevm。有没有办法做到这一点,以便vmwarevm不被删除?

5 个答案:

答案 0 :(得分:5)

使用dirname

$ dirname "/path/to/vm.vmwarevm/vm.vmx"
/path/to/vm.vmwarevm

答案 1 :(得分:4)

$ echo "/path/to/vm.vmwarevm/vm.vmx" | sed -r 's/(.*)\/.*/\1/g'
/path/to/vm.vmwarevm

但是还存在dirname命令:

$ dirname "/path/to/vm.vmwarevm/vm.vmx" 
/path/to/vm.vmwarevm

答案 2 :(得分:2)

其他答案都很好(我可能会使用dirname),但这也可以通过 parameter expansion完成:

$ p="/path/to/vm.vmwarevm/vm.vmx"
$ echo "${p%/*[!/]}"
/path/to/vm.vmwarevm
$ 

答案 3 :(得分:1)

使用shell内置函数(我更喜欢这种方式)

p="/path/to/vm.vmwarevm/vm.vmx"
echo ${p%/*}

使用sed(不带-r选项)

echo "/path/to/vm.vmwarevm/vm.vmx" | sed 's#/[^/]*$##'

顺便说一下,dirnamebasename在某些Unix系统中不起作用。

答案 4 :(得分:0)

echo /path/to/vm.vmwarevm/vm.vmx | xargs dirname