Regex匹配路径,不包括最终目录。Perl错误";搜索模式未终止于-e";

Regex匹配路径,不包括最终目录。Perl错误";搜索模式未终止于-e";,regex,bash,shell,perl,unix,Regex,Bash,Shell,Perl,Unix,假设我有一个目录路径 /abc/de/fgh/i/jk 我只想和你比赛 /abc/de/fgh/i/ 我该怎么做?我试过: (\/.*\/)* 这似乎起到了作用 但是,当我尝试时: path="/abc/de/fgh/i/jk" sliced=`echo $path | perl -pe '(\/.*\/)*'` 我得到一个错误: Search pattern not terminated at -e line 1 除了perl,还有更好的方法吗?这里给出一个perl错误到

假设我有一个目录路径

 /abc/de/fgh/i/jk
我只想和你比赛

 /abc/de/fgh/i/
我该怎么做?我试过:

 (\/.*\/)*
这似乎起到了作用

但是,当我尝试时:

 path="/abc/de/fgh/i/jk"
 sliced=`echo $path | perl -pe '(\/.*\/)*'`
我得到一个错误:

 Search pattern not terminated at -e line 1

除了perl,还有更好的方法吗?这里给出一个perl错误到底有什么不对?我的正则表达式在这里正确吗

使用
sed
,但要匹配要删除的内容(而不是要保留的内容):

输出
/abc/de/fgh/i/


正则表达式匹配结尾处的所有非斜杠字符,并将其替换为零,从而删除它们。

有一个coreutil来执行此操作,
dirname

path="/abc/de/fgh/i/jk"
sliced=`dirname "$path"`
但是,它也会删除尾随的
/
。如果出于任何原因需要它,只需将其附加到切片的
中即可:

sliced=`dirname "$path"`/
请务必引用
$path
;如果不这样做,它将不适用于包含空格的路径


您的Perl程序无法运行,因为您没有在其周围放置任何正则表达式操作符。它忽略第一个
\
,因为它不在字符串或正则表达式中,然后查找以正则表达式开头的
/
。因为没有未经scaped的
/
来结束它,所以它会给您这个错误。您可能需要类似于
s/(\/.\/)*./$1/
的东西,它应该删除上一次
/
之后的所有内容,为什么不使用参数扩展

echo "${path%/*}/"
echo "${path%/*}/"