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

Bash 删除字符串后面的所有内容,但不包括该字符串,bash,sed,awk,Bash,Sed,Awk,我正在使用vmrun list获取我机器上所有正在运行的vm,但我只需要目录名。目前输出为 /path/to/vm.vmwarevm/vm.vmx 我想要 /path/to/vm.vmwarevm 我知道我可以用 vmrun list|sed s/vmwarevm.*// 但这也删除了vmwarevm。有没有办法做到这一点,使vmwarevm不会被删除 $ echo "/path/to/vm.vmwarevm/vm.vmx" | sed -r 's/(.*)\/.*/\1/g' /path

我正在使用vmrun list获取我机器上所有正在运行的vm,但我只需要目录名。目前输出为

/path/to/vm.vmwarevm/vm.vmx
我想要

/path/to/vm.vmwarevm
我知道我可以用

vmrun list|sed s/vmwarevm.*//
但这也删除了vmwarevm。有没有办法做到这一点,使vmwarevm不会被删除

$ 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
但也存在
dirname
命令:

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

使用
dirname

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

使用
dirname

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

其他答案很好(我可能会使用
dirname
),但这也可以通过以下方法实现:


其他答案很好(我可能会使用
dirname
),但这也可以通过以下方法实现:


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

使用sed(不带-r选项)


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

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

echo /path/to/vm.vmwarevm/vm.vmx | xargs dirname
使用sed(不带-r选项)


顺便说一句,
dirname
basename
在某些Unix系统中不起作用。

当我尝试此操作时,我得到sed:invalize选项--rWell,
-r
是GNU sed的特定标志。也许你有一个BSD。当我尝试这个时,我得到了sed:非法选项--rWell,
-r
是GNU sed的特定标志。也许你有BSD一号。这是最好的答案,我想知道为什么它只有一票。。。所有其他答案都建议您运行单独的工具(如
sed
dirname
),但这个答案为您提供了一个没有开销的纯bash解决方案。这是最好的答案,我想知道为什么它只有一票。。。所有其他答案都建议您运行单独的工具(如
sed
dirname
),但这个答案为您提供了一个没有开销的纯bash解决方案;dirname“$mypath”#失败。您应该在dirname之后添加
--
。哦,顺便说一下:
mypath='--my cool path/to/file';dirname“$mypath”#失败
。您应该在dirname之后添加
--
echo /path/to/vm.vmwarevm/vm.vmx | xargs dirname