正则表达式以匹配路径,不包括最终目录。Perl 错误"search pattern not terminated at -e"



假设我有一个目录路径

 /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%/*}/"

相关内容

最新更新