正则表达式匹配路径,不包括最终目录。 Perl错误“搜索模式未在-e终止”

时间:2017-11-12 03:43:34

标签: regex bash shell perl unix

说我有一个目录路径

 /abc/de/fgh/i/jk

我只是想匹配

 /abc/de/fgh/i/

我该怎么做?我试过了:

 (\/.*\/)*

https://regexr.com/中似乎可以解决问题。

然而,当我尝试:

 path="/abc/de/fgh/i/jk"
 sliced=`echo $path | perl -pe '(\/.*\/)*'`

我收到错误:

 Search pattern not terminated at -e line 1

除了perl之外还有更好的方法吗?无论如何,这给出了一个perl错误有什么问题?我的正则表达式在这里是否正确?

3 个答案:

答案 0 :(得分:4)

有一个coreutil可以做到这一点,dirname

path="/abc/de/fgh/i/jk"
sliced=`dirname "$path"`

但是,它也会删除尾随/。如果您出于某种原因需要它,只需将其附加到sliced

sliced=`dirname "$path"`/

请务必引用$path;如果你不这样做,它就不会使用带有空格的路径。

您的Perl程序不起作用,因为您没有在其周围放置任何正则表达式运算符。它忽略了第一个\,因为它不在字符串或正则表达式中,然后找到/,它开始一个正则表达式。由于没有未转义的/结束它,它会给你错误。您可能想要s/(\/.*\/)*.*/$1/之类的东西,它应该删除最后/之后的所有内容。

答案 1 :(得分:1)

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

echo $path | sed 's,[^/]*$,,'

输出/abc/de/fgh/i/

正则表达式匹配所有非斜杠字符,并将其替换为空,删除它们。

答案 2 :(得分:1)

为什么不使用参数扩展?

echo "${path%/*}/"