2017-04-10 130 views
-1

基本上,我想将./foo/bar转换为./foo/bar/bar。我最初尝试sed,但我想出的正则表达式使用lookdound((?<=s\/)(.*))或\K转义序列(.*\/\K.*),sed不支持。如何提取基本名称并将其附加到路径

+0

对于具有该内容的单个变量?像这样的许多行的文件? –

+0

@Benjamin W.它用于find命令的输出:find。 -mindepth 2 -type d! - 路径。 ! -path ./foo – user3044148

+0

即使不会谈论你**代码的缺失部分,问题描述也是模糊的。当路径是下列之一时会发生什么?:'/'或'.'或'..'或'./ ..'等等?要么? './qoo/qxx /../../../一些/异国/美容/../'。 – jm666

回答

3

对于“我怎么追加/name/path/to/name”一般情况下,你可以使用参数扩展:

$ var='./foo/bar' 
$ echo "$var/${var##*/}" 
./foo/bar/bar 

${var##*/}扩展到$var*/(任何与结束时间最长可能的匹配值从一开始就被删除了。

如果你有每行这些条目中的一个文件,你可以做这样的事情与sed的:

$ cat infile 
./foo/bar 
./foo/bar/baz 
./path/to/file 
$ sed 's/\([^/]*\)$/\1\/\1/' infile 
./foo/bar/bar 
./foo/bar/baz/baz 
./path/to/file/file 

这对每行的最后/后捕捉一切,并附加斜杠和捕获序列到行尾。

+0

没有什么比删除子串好的旧*参数扩展*,做得好。 –

+0

@ DavidC.Rankin增加:_mostly_。 :)这个答案对于_most_案件来说很好,很简洁。例如何时不会DWIM:'/ foo/bar /','/ foo/bar //'(例如尾部斜杠)和角落案例如'..'(又名父目录或'./ ..'或'./../'和这种奇异的_(但有效的)_路径。)所以,是的 - 很好的答案 - 但是:_nothing beats_ ..并不完全正确。 ;) – jm666

相关问题