假设我有一个目录路径
/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错误有什么问题?我的正则表达式在这里甚至正确吗?
有一个 coreutil 可以做到这一点,dirname
:
path="/abc/de/fgh/i/jk"
sliced=`dirname "$path"`
但是,它也会删除尾随/
。如果您出于某种原因需要它,只需将其附加到sliced
:
sliced=`dirname "$path"`/
一定要引用$path
;如果你不这样做,它将无法处理带有空格的路径。
你的Perl程序不起作用,因为你没有在它周围放置任何正则表达式运算符。它忽略第一个,因为它不在字符串或正则表达式中,然后找到
/
,开始正则表达式。由于没有无法逃避的/
来结束它,因此它会给您带来错误。您可能想要类似 s/(/.*/)*.*/$1/
,它应该在最后一次/
之后擦除所有内容。
使用 sed
,但匹配要删除的内容(而不是要保留的内容(:
echo $path | sed 's,[^/]*$,,'
输出/abc/de/fgh/i/
正则表达式在末尾匹配所有非斜杠字符,并用任何内容替换它们,并删除它们。
为什么不使用参数扩展?
echo "${path%/*}/"