删除文件路径的一部分

问题描述:

我对脚本非常陌生,所以如果这听起来不太清楚,请道歉。删除文件路径的一部分

我有我婉削减了使用文件路径的sed:

文件路径可以类似于:

/to/be/removed/dir1a/keep/this/part 
/to/be/removed/dir2b/keep/this/part 
/to/be/removed/random/keep/this/part 

我要确保,无论我得到的格式,我总是以:

/keep/this/partRestored 

我发现了类似的例子,但我不能让他们使用上述规范。

编辑

对不起问题的原始模板是不是太清楚。对不起,浪费你的时间。 我基本上是在搜索文件的最新版本。 结果可能是以下任何形式:

/home/backup/dir1/destination/file 
/home/backup/dir2/destination2/file 
/home/backup/folder/destination3/file 

换句话说,我总是希望DIR1DIR2文件夹之前删除任何东西。 AND追加恢复到最后什么剩下。 我希望这更清楚。谢谢你的帮助。

+2

这些例子太笼统了。请提供相关示例 – nu11p01n73R 2014-10-31 11:39:38

+1

规则是什么?保留路径的最后3个部分?删除第一个4?它取决于模式吗?请更具体一些。 – 2014-10-31 11:40:36

+1

是“keep/this/part”总是一样吗?更好的例子请 – Leon 2014-10-31 11:41:05

如何

sed -r 's#.*/(dir1|dir2|folder)(/.*$)#\2/restore#g' 

测试:

sed -r 's#.*/(dir1|dir2|folder)(/.*$)#\2/restore#g' input 
/destination/file/restore 
/destination2/file/restore 
/destination3/file/restore 

编辑

更具体

sed -r 's#.*/(dir1|dir2|folder)[^/]*(/.*$)#\2/restore#g' 

测试:

$ echo "/home/backup/dir1_a/destination/file" | sed -r 's#.*/(dir1|dir2|folder)[^/]*(/.*$)#\2/restore#g' 
/destination/file/restore 
+0

如果在dir1,dir2和文件夹之后还有其他字符,该怎么办?例如: /home/backup/dir1_a/destination/file /home/backup/dir2_b/destination2/file /home/backup/folder_c/destination3/file – SSF 2014-10-31 12:06:41

+0

太棒了。那就是诀窍。再次抱歉,因为它不清楚。谢谢。 – SSF 2014-10-31 12:18:16

+0

@SSF_curious你总是欢迎:) – nu11p01n73R 2014-10-31 12:18:58

你可以使用basenamedirname

f=/home/backup/dir1/destination/file 
echo /$(basename $(dirname $f))/$(basename $f) 

删除/更改根部分:/to/be/removed/dir1a/keep/this/part

  • 总是同根

    sed 's#^/to/be/removed/#/NewPathYouWantAsRoot/#' InputFile

  • 总是相同的根的深度(在此示例中,深度= 3)

    sed 's#\(/[^/]*\)\{3\}/#/NewPathYouWantAsRoot/#' InputFile


添加/keep/this/partRestored(坐也路径与/作为最后一个字符,等的文件夹)

sed 's#/\{0,1\}$#/keep/this/partRestored#' InputFile 

任何这些组合都可以使用,只需将行动分开;即可。例如:

sed 's#\(/[^/]*\)\{3\}/#/NewPathYouWantAsRoot/#;s#/\{0,1\}$#/keep/this/partRestored#' InputFile