说我有一个目录路径
/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错误有什么问题?我的正则表达式在这里是否正确?
答案 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%/*}/"